I'm looking to automate the generation of purchase orders (POs) in Quickbooks.
We're using the CData ADO.NET provider for Quickbooks (desktop), but since we're using ItemAggregate to add lines to POs, I'm not sure the specific adapter makes a difference.
For readability, our POs have blank rows between certain sections. I'm struggling to replicate this in ItemAggregate. I've tried:
adding <Row/> (QB ignores this)
adding <Row><ItemDescription/></Row> (QB ignores this)
as #2, but with a single space in the ItemDescription (QB ignores this)
as #2, but with a tab in the ItemDescription (QB ignores this)
as #2, but with in the ItemDescription (QB prints " ")
as #5, but change to a single space after saving the PO (causes an exception: "There was an error when modifying a PurchaseOrder. QuickBooks error message: You have no items or one or more of your amounts is not associated with an item. Please enter an item.")
Does anyone know of a programmatic way to get QB to add a blank line to a purchase order?
The CData ADO.NET Provider has been updated to support this functionality.
You will need to add a new hidden connection property to your connection string. Add PreserveAggregateWhitespace=true to your connection string. Now when you insert or update transactions, your XML elements will retain their whitespace:
<Row><ItemDescription> </ItemDescription></Row>
Your INSERT statement for a new SalesOrder could look like:
INSERT INTO
SalesOrders (CustomerName, ItemAggregate)
VALUES
('Doe, John','<SalesOrderLineItems><Row><ItemName>Repairs</ItemName><ItemQuantity>1</ItemQuantity></Row><Row><ItemDescription> </ItemDescription></Row><Row><ItemName>Removal</ItemName><ItemQuantity>2</ItemQuantity></Row></SalesOrderLineItems>')
Notice the blank space in the ItemDescription.
You can contact the CData Software Support Team if you need the updated build.
Related
I have some code which gets details of lists in a SharePoint site then later wants to find out if a list with the same name still exists. This works fine except for list names that contain a colon - I find Graph misinterprets the colon and 'corrupts' the URL.
For instance, in Graph Explorer when I give it the following query:
https://graph.microsoft.com/v1.0/sites('mysite.sharepoint.com,aa-aa-aa,bb-bb-bb')/lists('19:abcdef#thread.tacv2_wiki')
The error response contains the following in the 'message' property:
The expression \"sites('mysite.sharepoint.com,aa-aa-aa,bb-bb-bb')/lists('19')/abcdef#thread.tacv2_wiki\" is not valid.
Note that it's split the original URL, thinking the colon is the start of a new segment in the path, even though it's inside a quote.
I've tried all sorts of quoting of the colon (%3A and %253A and %25253A) and different styles of quote characters, but they all either return the same error or give a parsing error.
More information - I specifically want to search by name not by original id (which would be much easier), I'm acutually using Graph Managed API in code but it generates the same error (you'd think it would internally know how to quote), the list is actually a hidden one created in a Teams site to manage channel information.
I was also able to reproduce your issue but as a work around you can use the filter query parameter to get the list by using below query.
https://graph.microsoft.com/v1.0/sites/soaadteam.sharepoint.com,c1178396-d845-46fa-bc0c-453d2951dad5,19ee9a1e-001d-48f1-9ee8-b0adfde54e45/lists?$filter=displayName eq '19:abcdef#thread.tacv2_wiki'
How do you use a zap to remove data from an existing field? For example, the fields "Name" and "Email" have data, but I need a zap that will just set those values as blank/null/empty.
The zap I'm using is for a Checklist in Process Street. There are several fields (i.e., email, name, etc.) that are already populated with data in the Checklist, and I want to remove those data. Of course if you just leave the fields blank in the zap, Zapier ignores them in the update. I've tried looking up environment variables but can't find anything, and blind guessing with inserting a space, "", {{NULL}}, " ", doesn't work. Thank you for your assistance!
The empty string will work in many cases, but if it's acting up, you could try adding a Formatter step and replacing the existing contents of the field (using the field you want to clear from an earlier step as the "find" part of find/replace) with the empty string (the replace part of find/replace). You can see this document for how the Formatter by Zapier app can be used:
https://zapier.com/apps/formatter/help#reformatting-text
This is a bit quirky, so if that doesn't work, you might try reaching out to customer service. They'll definitely have more specific advice for your Zap.
https://zapier.com/app/contact-us
I am trying to find the correct template and id to use for a hotprint of an advanced pdf template of an Item Fulfillment.
The hot print url is (with the id bolded) https://system.na3.netsuite.com/app/accounting/print/hotprint.nl?regular=T&sethotprinter=T&id=7600&label=Packing%20Slip&printtype=packingslip&trantype=itemship&orgtrantype=TrnfrOrd&auxtrans=7605
For some reason only certain id=# seems to affect the outcome and the ids I have got to work for two different templates don't match the Custom Transaction Forms ID or the Advanced pdf script id. (example most ids=template 1, while 168,4954, and seemingly random other ids=template 2) I am very confused on how netsuite resolves the hot print url as it normally doesn't include the template= part though I have seen others use it for invoice print urls.
The parameters at the end of the url (the stuff after the ?) are used by Netsuite to control settings used by the webpage which prints the PDFs for you.
In this case, &id=##### refers to the internal id of the document you are printing. You can see this by going to the document, right clicking, selecting inspect, and typing nlapiGetRecordId() into the console. When you click Print, you should see that same number after &id=#####.
&template=### refers to the template you are printing. If you go to Customization -> Forms -> Advanced PDF/HTML Templates, you'll notice a Script ID field in the table. If you substitute the correct Script ID in for the number in &template=###, you'll notice you generate the same PDF. This Script ID acts the same as the number that was previously there.
The reason you're seeing unusual results when you change those numbers is because you're mismatching a record with a template not built for it. So it won't print exactly right, but will sometimes execute anyways.
Anyways, this sort of parameter scheme is a similar scheme to how Suitelets and Restlets work, so in the future, you might experience this sort of thing again.
EDIT: For those reading this in the future, please read the comments.
To customize a packing slip and return form:
If you are printing packing slips and need some customization, you can use a custom invoice form when printing packing slips. For example, you can customize an invoice form to hide the fulfilled item tax rate and amount, and the order total. Then, when you print the packing slip using the custom form through mass print, choose the the packing slip shows the customized information.
I have a FIX application which is connected to several price providers. It distributes the data it received to our inner applications. When it is sending the received messages from the price providers to the target applications, it modifies the SendingTime(52) field in FIX header which is not acceptable. The inner applications want to get the original SendingTime value. How can I say to the QuickFIXJ engine not to assign a timestamp value?
Thanks
What you desire... is kind of wrong. Header fields are to be used by the engine, and for application data (which is what this relayed SendingTime kind of is on the second leg). Your inner FIX connection should not be clobbering the SendingTime field. You might need the actual SendingTime field if you are diagnosing problems with your inner connection!
What you really need is a second SendingTime field. You should edit the DD of your inner FIX applications to add another field for which to store the old SendingTime value. Tell your inner target apps to refer to that field.
NOTE: You probably don't want to use OrigSendingTime (tag 122) for this. That field has a very specific usage already. Name your new field something else.
FIX Market Data messages (35=W, 35=X) usually have MDEntryDate (#272) and MDEntryTime (#273) fields to represent the timestamp of the market data price. If it is related to Quote/trade messages, you may have the TransactTime (#60) field.
It worth keep the SendingTime (#52) and MDEntryDate MDEntryTime/TransactTime separated, you can compare the difference between the price's timestamp and the counter party's infra structure timestamp (sending time). It would help to identify delay between the systems.
If the message you are handling does not have any Application DateTime field, you can pick one. which its value would be the SendingTime for the original FIX message you've received.
You can either select and use an existent field (http://www.onixs.biz/fix-dictionary/4.4/fields_by_name.html) or you can create your own user defined field.
Once you decided to create your own field, it is a good practice to check the oficial Global Technical Committee user defined fields list at https://www.fixtrading.org/standards/user-defined-fields/ and using the user defined fields range.
Sites
Fields by message: https://www.onixs.biz/fix-dictionary.html
User defined fields: https://www.fixtrading.org/standards/user-defined-fields/
I have the following query to one of my database tables:
select count(*) as mycount
from mytable
where fieldone = :fieldone
and fieldtwo = :fieldtwo
Parameters are correctly loaded into the query (both of type String).
When I run this query outside the app (for instance, through the dbexplore) and replace the parameters with the actual values, I get the correct result. But when running it in the app, I get a Field 'fieldtwo' not found error, right on the Query.Open call.
Why would the BDE not find this field, when it actually exist?
Update: The following query, executed right after the first one (the one that fails), works fine in the app:
select *
from mytable
where fieldone = :fieldone
order by fieldone, fieldtwo
The best guess is that you have populated the field list in the query, this overrides any concept of the underlying fields that are in the query and is a cause of countless confusion.
Right click on the query, pick the fields editor clear all the values that are there and then choose 'add all fields' that should cause the missing field to appear once the query is executed.
I think it should auto-populate the fields if there are no defined fields when the query is executed, so you may not need to choose 'add all fields' after clearing the fields.
Whenever we come across a problem like this we tend to remove the query from the form and create it dynamically at run time... It depends how ingrained into the form it is...
E.g. If you have a data aware control looking at "fieldtwo" which tries to fetch some data when the underlying data set gets updated then it'll trigger an error like this, but it's more obvious when you've written code such
SomeEdit.Text = Query.FieldByName("fieldtwo").AsString;
That way it falls over on the relevant line instead of the open (triggering a related event)
Clear the query content using Query1.SQL.Clear; statement before opening it.
Other reason can be you are opening other database which may not have the specified field. Be sure that both the DatabaseName's in your app and dbexplore are same
I used to face porblems with BDE when i have SQLExplorer open and the app accesses the DB at the same time (but i had errors like ), try closing the Explorer it may help, if not i would build the SQL as text without the Parameters and try if it works then (if its possible in your situation).
I don't use parameters, so I'm just grabbing at straws here. I still use the BDE regularly, but am no expert. I find I shy away from more complex expressions (which yours is not!) because of the little "surprises" like this that the BDE throws at you.
Perhaps adding parentheses:
where (fieldone = :fieldone)
and (fieldtwo = :fieldtwo)
Or, single or double quote signs (this probably will make it worse?)
where (fieldon = ":fieldone")
and (fieldtwo = ":fieldtwo")
Or, to explore the problem, remove the "and fieldtwo = :fieldtwo" line and see if it runs.
Would it be possible for you to do your own parameter substitution with a StringReplace as in
Query1.SQL.Text := StringReplace(Query1.SQL.Text, ":fieldone", "MyVarName",[rfReplaceAll ]);
If you are creating a ClienDataSet in memory by the Create DataSet method, you should check the TFieldDefs property, which must have a different field name or not created
I was having a weird but small problem, I'll post in case it will help someone in some day.
uRegPeople.pas
with frmEditPerson do
begin
PersonID := qryPerson.FieldByName(ID).AsInteger;
...
end;
I had qryPerson both in frmRegPeople and in frmEditPerson, by using with I was referencing to frmEditPerson.qryPerson, however I wanted to reference to frmRegPeople.qryPerson. Then I need to change to the following code.
with frmEditPerson do
begin
PersonID := Self.qryPerson.FieldByName(ID).AsInteger;
...
end;
// Explanation
// qryPerson --> frmEditPerson.qryPerson;
// Self.qryPerson --> frmRegPeople.qryPerson;