0
votes

Pourquoi cette requête SQL fonctionne-t-elle dans Query Designer mais pas dans VBA pour avoir accès?

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> xxx pré>

celui-ci échoue avec une erreur forte> 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


15 commentaires

# 9/33/2020 # 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' , 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 ', pas 01-10-2005


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 un mot réservé?


3 Réponses :


1
votes

avoir une lecture ici https://support.flexquarters.com/esupport/index.php?/knowledgebase/article/view/2638/44/QODBC -desktop-Dépannage --- Comment-utilisation-laady-date-et-daadd-fonction-in-qodbc

Le format correct semble être {d 'yyyy-mm-dd'} Il existe une fonction fournie pour faire une date la chaîne correcte;

fonction: xxx


6 commentaires

Utilisez simplement le format : format (maintenant (), "AAAA-MM-DD")


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.



1
votes

Comme @Minty a commenté et posté, vos dates sont le problème.

  • Lorsque vous utilisez des requêtes à l'intérieur de l'interface graphique MS Access, telle que avec la requête designers, vous êtes régi au dialecte SQL Access. li>
  • Lors de la connexion via ODBC Pilote à une base de données externe, vous êtes régi au dialecte SQL de la base de données de connexion, voici des quickbooks. li> ul>

    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>

    Accès MS Access H2>

    MS Access Dates Si elle est envoyée littéralement, devrait être encapsulé avec des hachées, # code>: p> xxx pré>

    Alternativement, utilisez 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
    


6 commentaires

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 (qui devrait exister avant facture ). 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 ... Une fois encore, vous avez utilisé un DIFFÉRENT DIFFERENT 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.



0
votes

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"


4 commentaires

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 (Pas de citations ou d'autres enceintes). Appelez ensuite DOCMD.OPENQUERY . 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 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 (N'utilisez pas moi. , la référence relative). Et n'oubliez pas de citations, de hashtags ou d'autres enclos.