I am new to the R3 method Query::insert_recordset so I researched how this is used but alas, my understanding is unfruitful thus far.
I have two custom tables. One called AltLoadDetailsData (holds custom data about load information). AltLoadDetailsDataFiltered is simply a duplicated version of the other table that will simply act as a temporary location to store a filtered or subset of the AltLoadDetailsData table.
I have a simple form that has options to filter the original table data using a few options. There are checkboxes that indicate which filters to use and if checked, it adds a range to the query that uses the populated value from the form.
Below the optional filter criteria checkboxes, I have a simple OK command button that will populate the filtered table and then refresh the grid below that using the new query. It thought this was a wonderful opportunity to use the new feature in R3 to bulk insert into a table based on a query and a map. However, I have tried each example I found with no luck. I either get the error that there is a mismatch on fields I am mapping or the error stating that I cannot insert multiple records. I debug and the query object and the qdbs object show the correct query but when I execute the actual Query::insert_recordset() it goes straight to the exception without giving me a clue as to what is wrong.
Below is the code that is in my clicked() event on the OK command button on the form:
void clicked() { Query query; QueryRun queryRun; QueryBuildDataSource qbds; QueryBuildRange qbr; QueryBuildFieldList qbdsFldList; Map targetToSourceMap = new Map(Types::String, Types::Container); ALTLoadDetailsDataFiltered altLoadFiltered; int dataSourceUniqueId; // Clear the temp table to be used for the grid. delete_from altLoadFiltered; query = new Query(); qbds = query.addDataSource(tableNum(ALTLoadDetailsData)); if ( Warehouse.checked() ) { qbr = qbds.addRange( fieldNum(ALTLoadDetailsData,Warehouse)); qbr.value(SysQuery::value(FilterOptions_Warehouse.valueStr())); } if ( LoadStatus.checked() ) { qbr = qbds.addRange( fieldNum(ALTLoadDetailsData,LoadStatus)); qbr.value(SysQuery::value(FilterOptions_LoadStatus.valueStr())); } if ( Direction.checked() ) { qbr = qbds.addRange( fieldNum(ALTLoadDetailsData,Direction)); qbr.value(SysQuery::value(FilterOptions_Direction.valueStr())); } if ( Site.checked() ) { qbr = qbds.addRange(fieldNum(ALTLoadDetailsData,Site)); qbr.value(SysQuery::value(FilterOptions_Site.valueStr())); }
//I was using this variable for all entries in the mapping below but I've seen examples both ways.
// I'm not sure which one is accurate to use. //dataSourceUniqueId = qbds.uniqueId(); qbds.fields().clearFieldList(); qbdsFldList = qbds.fields(); qbdsFldList.addField(fieldNum(ALTLoadDetailsData, AccountNumber)); qbdsFldList.addField(fieldNum(ALTLoadDetailsData, BillingGroupId)); qbdsFldList.addField(fieldNum(ALTLoadDetailsData, CarrierService)); qbdsFldList.addField(fieldNum(ALTLoadDetailsData, CustomerFreightCharge)); qbdsFldList.addField(fieldNum(ALTLoadDetailsData, DelayedShipmentDays)); qbdsFldList.addField(fieldNum(ALTLoadDetailsData, DeliveryTerms)); qbdsFldList.addField(fieldNum(ALTLoadDetailsData, Direction)); qbdsFldList.addField(fieldNum(ALTLoadDetailsData, FreightBill)); qbdsFldList.addField(fieldNum(ALTLoadDetailsData, FreightBillInvoice)); qbdsFldList.addField(fieldNum(ALTLoadDetailsData, FreightRevenue)); qbdsFldList.addField(fieldNum(ALTLoadDetailsData, LoadId)); qbdsFldList.addField(fieldNum(ALTLoadDetailsData, LoadShippedConfirmationDateTime)); qbdsFldList.addField(fieldNum(ALTLoadDetailsData, LoadStatus)); qbdsFldList.addField(fieldNum(ALTLoadDetailsData, LoadTemplateId)); qbdsFldList.addField(fieldNum(ALTLoadDetailsData, LoadWeight)); qbdsFldList.addField(fieldNum(ALTLoadDetailsData, Mode)); qbdsFldList.addField(fieldNum(ALTLoadDetailsData, OrderNumber)); qbdsFldList.addField(fieldNum(ALTLoadDetailsData, ProductWeightTBD)); qbdsFldList.addField(fieldNum(ALTLoadDetailsData, ProNumber)); qbdsFldList.addField(fieldNum(ALTLoadDetailsData, Route)); qbdsFldList.addField(fieldNum(ALTLoadDetailsData, ScheduledLoadShippingDateTime)); qbdsFldList.addField(fieldNum(ALTLoadDetailsData, ShipFromPostalCode)); qbdsFldList.addField(fieldNum(ALTLoadDetailsData, ShipmentId)); qbdsFldList.addField(fieldNum(ALTLoadDetailsData, ShippingCarrier)); qbdsFldList.addField(fieldNum(ALTLoadDetailsData, ShipToPostalCode)); qbdsFldList.addField(fieldNum(ALTLoadDetailsData, Site)); qbdsFldList.addField(fieldNum(ALTLoadDetailsData, Warehouse)); qbdsFldList.dynamic(QueryFieldListDynamic::No); targetToSourceMap.insert(fieldStr(ALTLoadDetailsDataFiltered, AccountNumber), [qbds.uniqueId(), fieldStr(ALTLoadDetailsData, AccountNumber)]); targetToSourceMap.insert(fieldStr(ALTLoadDetailsDataFiltered, BillingGroupId), [qbds.uniqueId(), fieldStr(ALTLoadDetailsData, BillingGroupId)]); targetToSourceMap.insert(fieldStr(ALTLoadDetailsDataFiltered, CarrierService), [qbds.uniqueId(), fieldStr(ALTLoadDetailsData, CarrierService)]); targetToSourceMap.insert(fieldStr(ALTLoadDetailsDataFiltered, CustomerFreightCharge), [qbds.uniqueId(), fieldStr(ALTLoadDetailsData, CustomerFreightCharge)]); targetToSourceMap.insert(fieldStr(ALTLoadDetailsDataFiltered, DelayedShipmentDays), [qbds.uniqueId(), fieldStr(ALTLoadDetailsData, DelayedShipmentDays)]); targetToSourceMap.insert(fieldStr(ALTLoadDetailsDataFiltered, DeliveryTerms), [qbds.uniqueId(), fieldStr(ALTLoadDetailsData, DeliveryTerms)]); targetToSourceMap.insert(fieldStr(ALTLoadDetailsDataFiltered, Direction), [qbds.uniqueId(), fieldStr(ALTLoadDetailsData, Direction)]); targetToSourceMap.insert(fieldStr(ALTLoadDetailsDataFiltered, FreightBill), [qbds.uniqueId(), fieldStr(ALTLoadDetailsData, FreightBill)]); targetToSourceMap.insert(fieldStr(ALTLoadDetailsDataFiltered, FreightBillInvoice), [qbds.uniqueId(), fieldStr(ALTLoadDetailsData, FreightBillInvoice)]); targetToSourceMap.insert(fieldStr(ALTLoadDetailsDataFiltered, FreightRevenue), [qbds.uniqueId(), fieldStr(ALTLoadDetailsData, FreightRevenue)]); targetToSourceMap.insert(fieldStr(ALTLoadDetailsDataFiltered, LoadId), [qbds.uniqueId(), fieldStr(ALTLoadDetailsData, LoadId)]); targetToSourceMap.insert(fieldStr(ALTLoadDetailsDataFiltered, LoadShippedConfirmationDateTime), [qbds.uniqueId(), fieldStr(ALTLoadDetailsData, LoadShippedConfirmationDateTime)]); targetToSourceMap.insert(fieldStr(ALTLoadDetailsDataFiltered, LoadStatus), [qbds.uniqueId(), fieldStr(ALTLoadDetailsData, LoadStatus)]); targetToSourceMap.insert(fieldStr(ALTLoadDetailsDataFiltered, LoadTemplateId), [qbds.uniqueId(), fieldStr(ALTLoadDetailsData, LoadTemplateId)]); targetToSourceMap.insert(fieldStr(ALTLoadDetailsDataFiltered, LoadWeight), [qbds.uniqueId(), fieldStr(ALTLoadDetailsData, LoadWeight)]); targetToSourceMap.insert(fieldStr(ALTLoadDetailsDataFiltered, Mode), [qbds.uniqueId(), fieldStr(ALTLoadDetailsData, Mode)]); targetToSourceMap.insert(fieldStr(ALTLoadDetailsDataFiltered, OrderNumber), [qbds.uniqueId(), fieldStr(ALTLoadDetailsData, OrderNumber)]); targetToSourceMap.insert(fieldStr(ALTLoadDetailsDataFiltered, ProductWeightTBD), [qbds.uniqueId(), fieldStr(ALTLoadDetailsData, ProductWeightTBD)]); targetToSourceMap.insert(fieldStr(ALTLoadDetailsDataFiltered, ProNumber), [qbds.uniqueId(), fieldStr(ALTLoadDetailsData, ProNumber)]); targetToSourceMap.insert(fieldStr(ALTLoadDetailsDataFiltered, Route), [qbds.uniqueId(), fieldStr(ALTLoadDetailsData, Route)]); targetToSourceMap.insert(fieldStr(ALTLoadDetailsDataFiltered, ScheduledLoadShippingDateTime), [qbds.uniqueId(), fieldStr(ALTLoadDetailsData, ScheduledLoadShippingDateTime)]); targetToSourceMap.insert(fieldStr(ALTLoadDetailsDataFiltered, ShipFromPostalCode), [qbds.uniqueId(), fieldStr(ALTLoadDetailsData, ShipFromPostalCode)]); targetToSourceMap.insert(fieldStr(ALTLoadDetailsDataFiltered, ShipmentId), [qbds.uniqueId(), fieldStr(ALTLoadDetailsData, ShipmentId)]); targetToSourceMap.insert(fieldStr(ALTLoadDetailsDataFiltered, ShippingCarrier), [qbds.uniqueId(), fieldStr(ALTLoadDetailsData, ShippingCarrier)]); targetToSourceMap.insert(fieldStr(ALTLoadDetailsDataFiltered, ShipToPostalCode), [qbds.uniqueId(), fieldStr(ALTLoadDetailsData, ShipToPostalCode)]); targetToSourceMap.insert(fieldStr(ALTLoadDetailsDataFiltered, Site), [qbds.uniqueId(), fieldStr(ALTLoadDetailsData, Site)]); targetToSourceMap.insert(fieldStr(ALTLoadDetailsDataFiltered, Warehouse), [qbds.uniqueId(), fieldStr(ALTLoadDetailsData, Warehouse)]); ttsBegin; Query::insert_recordset(altLoadFiltered, targetToSourceMap, query); ttsCommit;
//Refresh the form data source for the grid ALTLoadDetailsDataFiltered_ds.research(); ALTLoadDetailsDataFiltered_ds.refresh(); }
Here is a picture of the form I created.
Below is the actual error that is currently occurring.
I have completed a full SQL database synchronization, a full CIL and have compiled all related code to this.
I cannot see why the code is trying to insert Warehouse in the first field instead of AccountNumber to begin with.
If someone can point out what I am doing wrong, I will be grateful. I'm hoping it's something simple I've been missing.
Thanks,
Ray