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();
}
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.