Lorsque j'exécute les deux requêtes suivantes dans Créer> Requête une après l'autre, elles fonctionnent parfaitement. Lorsque j'essaie d'exécuter les requêtes dans VBA, seuls le premier (Invoiceline) fonctionne.
Je sais pour un fait ce n'est pas la requête elle-même qui est le problème, c'est la façon dont je suis peut-être établir la connexion. Je reçois l'erreur invalide lexicale lorsque vous essayez d'exécuter la requête. P>
Lorsque vous appuyez sur un bouton, cette requête est exécutée correctement forte> p> Boutonone_Click () P> ButTontwo_Cliquez () p> Const adOpenStatic = 3
Const adLockOptimistic = 3
Dim oConnection
Dim oRecordset
Dim sMsg
Dim sConnectString
Dim sSQL
sConnectString = "DSN=Quickbooks Data;OLE DB Services=-2;"
sSQL = "INSERT INTO Invoice (CustomerRefListID, ARAccountRefListID, TxnDate, RefNumber, BillAddressAddr1, BillAddressAddr2, BillAddressCity, BillAddressState, BillAddressPostalCode, BillAddressCountry, IsPending, TermsRefListID, DueDate, ShipDate, ItemSalesTaxRefListID, Memo, IsToBePrinted, CustomerSalesTaxCodeRefListID) VALUES ('800001F6-1482536280', '8000001E-1478562986', #9/23/2020#, '1', 'Brad Lamb', '1921 Appleseed Lane', 'Bayshore', 'CA', '94326', 'USA', 0, '80000002-1478562832', #10/31/2020#, #10/01/2020#, '8000295C-1541711590', 'Memo Test', 0, '80000001-1478562826')"
Set oConnection = CreateObject("ADODB.Connection")
Set oRecordset = CreateObject("ADODB.Recordset")
oConnection.Open sConnectString
oConnection.Execute (sSQL)
sMsg = sMsg & "Invoice was Sent to QuickBooks"
MsgBox sMsg
End Sub
3 Réponses :
avoir une lecture ici Le format correct semble être {d 'yyyy-mm-dd'}
Il existe une fonction fournie pour faire une date la chaîne correcte; p> fonction: p>
Utilisez simplement le format code>:
format (maintenant (), "AAAA-MM-DD") CODE>
J'ai juste essayé de soumettre la date, {d'2005-09-23 '},
Toujours pas de chance, même problème
NOTE Il y a un espace entre le D et le '
Le problème est toujours le même, mais une question secondaire rapide, est-il correct d'avoir deux instructions de requête SSQL = "" distinctes pour les requêtes liées? Ou pourrait avoir les deux déclarations de requête sous le même SSQL = ""?
Non, vous insérez des données dans deux tables distinctes, ce qui nécessite deux requêtes.
Comme @Minty a commenté et posté, vos dates sont le problème.
Aucun dialecte SQL SQL est toujours identique, mais la plupart tentent de se conformer aux normes ANSI. Par conséquent, les mêmes requêtes peuvent em> échouer entre la requête de requête et VBA. P> MS Access Dates Si elle est envoyée littéralement, devrait être encapsulé avec des hachées, # code>: p> Alternativement, utilisez Accès MS Access H2>
CDate () code> pour convertir la chaîne à la date: p>
' PREPARED STATEMENT WITH PLACEHOLDERS (NO LITERAL DATA)
sql = "INSERT INTO Invoice (CustomerRefListID, ARAccountRefListID, TxnDate, RefNumber, " _
& " BillAddressAddr1, BillAddressAddr2, BillAddressCity, " _
& " BillAddressState, BillAddressPostalCode, BillAddressCountry, " _
& " IsPending, TermsRefListID, DueDate, ShipDate, " _
& " ItemSalesTaxRefListID, [Memo], IsToBePrinted, " _
& " CustomerSalesTaxCodeRefListID) " _
& " VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?," _
& " ?, ?, ?, ?, ?, ?, ?, ?, ?)"
' OPEN CONNECTION
Set oConnection = CreateObject("ADODB.Connection")
oConnection.Open sConnectString
' INITIALIZE AND RUN COMMAND
Set oCmd = CreateObject("ADODB.Command") ' NEW ADO OBJECT
With oCmd
.ActiveConnection = oConnection
.CommandText = sql
.CommandType = adCmdText
' BIND PARAMETERS
.Parameters.Append .CreateParameter("pm1", adVarChar, adParamInput, ,"800001F6-1482536280")
.Parameters.Append .CreateParameter("pm2", adVarChar, adParamInput, ,"8000001E-1478562986")
.Parameters.Append .CreateParameter("pm3", adDate, adParamInput, , CDate("9/23/2020"),
.Parameters.Append .CreateParameter("pm4", adVarChar, adParamInput, ,"1")
.Parameters.Append .CreateParameter("pm5", adVarChar, adParamInput, ,"Brad Lamb")
.Parameters.Append .CreateParameter("pm6", adVarChar, adParamInput, ,"1921 Appleseed Lane")
.Parameters.Append .CreateParameter("pm7", adVarChar, adParamInput, ,"Bayshore")
.Parameters.Append .CreateParameter("pm8", adVarChar, adParamInput, ,"CA")
.Parameters.Append .CreateParameter("pm9", adVarChar, adParamInput, ,"94326")
.Parameters.Append .CreateParameter("pm10", adVarChar, adParamInput, ,"USA")
.Parameters.Append .CreateParameter("pm11", adInteger, adParamInput, , 0)
.Parameters.Append .CreateParameter("pm12", adVarChar, adParamInput, ,"80000002-1478562832")
.Parameters.Append .CreateParameter("pm13", adDate, adParamInput, , CDate("10/31/2020"))
.Parameters.Append .CreateParameter("pm14", adDate, adParamInput, , CDate("10/01/2020"))
.Parameters.Append .CreateParameter("pm15", adVarChar, adParamInput, ,"8000295C-1541711590")
.Parameters.Append .CreateParameter("pm16", adVarChar, adParamInput, ,"Memo Test")
.Parameters.Append .CreateParameter("pm17", adInteger, adParamInput, ,0)
.Parameters.Append .CreateParameter("pm18", adVarChar, adParamInput, ,"80000001-1478562826")
' RUN PARAMETERIZED QUERY
.Execute
End With
oConnection.Close
Set oCmd = Nothing: Set oConnection = Nothing
Ok donc j'ai essayé votre code juste sous "QuickBooks ODBC", il semblait fonctionner car maintenant, je reçois une erreur différente: [qodbc] non pris en charge - au moins un enregistrement de ligne est requis. Veuillez insérer l'enregistrement (s) d'enfant / de détail avant d'insérer un enregistrement parent / en-tête. Pour plus de détails, veuillez visiter: godbc.comInks / 2953 "
Le problème est que Invoiceline, la première pièce de code que j'ai posté est l'enfant de la recherche de
Je sais pour un fait que les deux devraient fonctionner car encore une fois, il a fait dans la requête de requête
Habituellement, les lignes de table des parents sont insérées avant les enfants liés car cela semble être une question de relations dans QuickBooks. Êtes-vous allé à leur URL: support.flexquarters.com /esupport/index.php?/knowledgebase/... ? Comme le concepteur de requêtes fonctionne, vous devrez également exécuter les deux requêtes d'appends, mais également réfléchir à la commande. Peut-être aussi cette requête se rapporte à d'autres tables telles que CLIENT I> (qui devrait exister avant facture i>). Encore plus, vos essais précédents peuvent invalider les prochains essais, car les clés devraient avoir besoin d'être uniques. Essayez de tester sur le nouvel exemple de facturation.
Il devrait simplement s'appencher une fois la première requête, non?
Sauf si QuickBooks ait des déclencheurs définis pour que les deux tables se connectent, puis oui. Néanmoins, votre numéro immédiat des requêtes ne fonctionne pas devrait être résolue, non? Je sais que je sais que les deux devraient fonctionner, car une fois encore, il a fait dans Query Designer I> ... Une fois encore, vous avez utilisé un DIFFÉRENT DIFFERENT i> Moteur pour rendre le même / i> Les dialectes SQL Command et SQL diffèrent des moteurs (allemand <> anglais même si les deux disent la même chose!). La beauté du paramétrage est peu importe les types de données ou la base de données, vous abstraitez les évasions ou les formatage spécifiques de dialecte. S'il vous plaît considérer la dernière option.
S'il s'agit d'une application d'accès, je recommanderais que, au lieu de réécrire la requête dans le code SQL / VBA, prenez plutôt une autre approche: laissez la requête de travail comme objet de requête et utilisez plutôt VBA pour le déclencher:
DoCmd.OpenQuery "QueryName"
Je considérerais cela, mais j'utilise également un formulaire avec des zones de texte pour saisir la requête. Le code que j'utilise dans mon message inclut uniquement les entrées statiques que j'ai présentées pour l'exemple. Est-ce que vous proposez également des entrées d'un formulaire?
@RICHARDWALTON, vous pouvez faire valoir des valeurs dans une requête enregistrée pour former des commandes: formulaires! MyForm! MyControl CODE> (Pas de citations ou d'autres enceintes). Appelez ensuite
DOCMD.OPENQUERY CODE>. Vous pouvez également passer des paramètres à une requête sauvegardée à l'aide de QueryDefs , mais cela utilise la mise en œuvre DAO (PAS ADO). Enfin, vous pouvez utiliser Ado comme j'ai proposé ci-dessus, en passant des valeurs dynamiques dans
Creeparamètre CODE> Appels (dernier argument). Avez-vous essayé cela? Stackoverflow a beaucoup, beaucoup messages sur le paramétrage SQL dans VBA.
@Parfait j'ai eu la requête sauvegardée de travailler, est-ce qu'il y a un moyen de faire la toutes les invites qui apparaissent, accepter automatiquement (appuyez sur YES seul)?
Il ne faut pas vous inviter si le formulaire est ouvert à l'écran pour que les contrôles soient disponibles par requête. Si le formulaire est ouvert, alors vous avez mal tapé le chemin de contrôle de forme absolu. Remarque Les sous-formes ont des chemins différents. Envisagez cette page: Access.mvps.org/Access/forms/frm0031.htm a> (N'utilisez pas moi. code>, la référence relative). Et n'oubliez pas de citations, de hashtags ou d'autres enclos.
# 9/33/2020 # code> n'est pas valide SQL.
Prenez le SQL sur SSMS et essayez de le soumettre directement à votre instance SQL Server. Vous devriez obtenir de meilleurs diagnostics.
@Corion quelle est la bonne façon de soumettre la date? À la place d'utiliser " # " ?
'2020-09-23' code>, mais cela dépend de vos paramètres de base de données.
Voici ce qui n'a pas de sens pour moi, pourquoi ces requêtes travaillent-elles dans Create> Query?
Lorsqu'il est exécuté à travers la fenêtre de requête, l'accès utilisera son interprète pour gérer les dates de la bonne façon, lorsqu'il est invoqué dans VBA, vous passez directement à la connexion ODBC qui ne comprend pas la syntaxe d'accès.
@Minty je vois, je n'arrive pas à trouver comment Qodbc veut les dates formatées
S'il vous plaît jeter un oeil à ma mise à jour
@Corion # 9/23/2020 # est une utilisation correcte d'utilisation SQL pour les dates. L'utilisation de "# #" est la manière dont vous indiquez des dates d'accès.
@Karlomanio Oui c'est l'utilisation du bon accès SQL mais la mauvaise syntaxe de QODBC
Pouvez-vous créer un lien vers les tables QuickBooks? Si oui, quel type de données l'accès pense-t-il que les colonnes de date sont? Ils peuvent peut-être texter de manière bizarre. Les packages de comptes sont bizarres ...
Avez-vous utilisé des citations simples autour de vos tentatives de date?
'01 -10-2005 ' code>, pas
01-10-2005 code>
J'ai regardé dans la table liée pour la facture et la colonne de TXNDate montre simplement le format "mm / jj / aaaa"
@Corion oui citations simples
Bien que je n'ai aucun indice de QODBC, si vous n'avez pas tous les champs nécessaires, essayez d'exécuter une inscription minimale d'insertion vivant d'autres champs comme NULL et ajoutez des champs à la relevé d'une par une pour voir quel champ causent le problème? Est
mémo code> un mot réservé?