Commande dans Acomba par Access
3 participants
- lboisvert
- Nombre de messages : 8
Date d'inscription : 19/07/2010
Commande dans Acomba par Access
Mer 24 Nov 2010 - 9:27
Bonjour,
Je transfert des commandes dans Acomba en utilisant ODBC par Access. Lorsque j'ai des commandes de 6 lignes et plus mon programmen plante sur la ligne
rstTransactionDetail.Update
il me donne le message suivant "La ligne n'a pas pu être trouvé pour la mise à jour. Certaines valeurs ont peut-être changé depuis leur dernière lecture."
Fait bizarre : si je exécute à nouveau le programme il va passer correctement j'usqu'a la prochaine commande de 6 lignes ou plus.
Aidez-moi svp, je ne sais plus quoi faire.
Merci
Je transfert des commandes dans Acomba en utilisant ODBC par Access. Lorsque j'ai des commandes de 6 lignes et plus mon programmen plante sur la ligne
rstTransactionDetail.Update
il me donne le message suivant "La ligne n'a pas pu être trouvé pour la mise à jour. Certaines valeurs ont peut-être changé depuis leur dernière lecture."
Fait bizarre : si je exécute à nouveau le programme il va passer correctement j'usqu'a la prochaine commande de 6 lignes ou plus.
Aidez-moi svp, je ne sais plus quoi faire.
Merci
- PlanteG
- Nombre de messages : 1024
Ville : Québec
Date d'inscription : 11/07/2007
Fiche d'Entreprise
Nom de l'entreprise: Informatique Gilles Plante
RE: Commande dans Acomba par Access
Mer 24 Nov 2010 - 10:34
J'ai une petite suggestion: poster le code de votre fonction d'insertion de commande. Ça pourrait peut-être aider à trouver l'explication pour cette erreur.
- lboisvert
- Nombre de messages : 8
Date d'inscription : 19/07/2010
RE: COMMANDE DANS ACOMBA PAR ACCESS
Mer 24 Nov 2010 - 12:50
Voici le code intégral.
Donc tel que mentionné c'est la ligne rstTransactionDetail.Update
de la 6ieme ligne de commande qui plante.
Merci
****** CODE *********
Sub ExportationAcomba()
'Déclaration des variables
Dim strsql As String
Dim tbl As DAO.Recordset
Dim cnn As New ADODB.Connection
Dim rstTransactionHeader As New ADODB.Recordset
Dim rstTransactionDetail As New ADODB.Recordset
Dim rstCustomerData As New ADODB.Recordset
Dim rstCustomerData2 As New ADODB.Recordset
Dim rstProductData As New ADODB.Recordset
Dim rstProductGroup As New ADODB.Recordset
Dim rstCurrentTaxes As New ADODB.Recordset
Dim rstLastTransHeader As New ADODB.Recordset
Dim rstLastTransDetail As New ADODB.Recordset
Dim Numero As String
Dim trouve As Integer
Dim clientdiff As Integer
Dim vProduit As String
Dim vDescription As String
Dim vNoCommande As String
cnn.ConnectionString = "DSN=DEMO"
'cnn.ConnectionString = "DSN=RAYNOX"
cnn.CursorLocation = adUseClient
cnn.Open
On Error GoTo ExportationAcomba_Err
strsql = "tmpCommande"
Set tbl = CurrentDb.OpenRecordset(strsql)
tbl.MoveFirst
vNoCommande = Str(tbl![NoCommande])
'Boucle tant qu'il y a des commandes dans la table tmpCommande
Do Until tbl.EOF
cnn.Execute ("BEGIN_TRANSACTION_IN")
rstTransactionHeader.Open "SELECT * FROM TransactionHeader", cnn, adOpenKeyset, adLockOptimistic
trouve = 0
clientdiff = 0
'Vérifie si la commande existe dans la table TransactionHeader d'Acomba
Do Until rstTransactionHeader.EOF
If Trim(rstTransactionHeader![InAssociatedOrder]) = tbl![NoCommande] Then
trouve = 1
MsgBox "La commande " & tbl![NoCommande] & " est déjà créée dans Acomba. À VÉRIFIER!!!"
GoTo suivant
End If
If Trim(rstTransactionHeader![InInvoiceNumber]) = tbl![NoCommande] Then
trouve = 1
MsgBox "La commande " & tbl![NoCommande] & " est déjà créée dans Acomba. À VÉRIFIER!!!"
GoTo suivant
End If
rstTransactionHeader.MoveNext
Loop
rstTransactionHeader.AddNew
'Pour une commande
rstTransactionHeader!InInvoiceType = 2
'rstTransactionHeader!InReference = ""
rstTransactionHeader!InReference = "PO # " & tbl![NoCommande] & " - " & Left(tbl![Instructions], 13)
rstTransactionHeader!InDescription = tbl![Instructions]
rstTransactionHeader!InCurrentDay = 1
rstTransactionHeader!InDate = tbl![DateCommande]
rstTransactionHeader!InTransactionActive = 1
rstTransactionHeader![InInvoiceNumber] = tbl![NoCommande]
If tbl![ExpedieVia] = "Votre camion" Then
rstTransactionHeader!InShippingNumber = 1
rstTransactionHeader!InShippingCP = 1
End If
'Nom du client associé à la facture
If tbl![Devise] = "USD" Then
CustomerName = "TREMCAR INC. - ($ us)"
CustomerName2 = "TREMCAR ST-CESAIRE INC."
Else
If tbl![NomClient] = "TREMCAR IBERVILLE" Then
CustomerName = "TREMCAR INC."
' ElseIf tbl![NomClient] = "HUTCHINSON INDUSTRIES" Then
' CustomerName = "HUTCHINSON INDUSTRIES CANADA"
' Else
' CustomerName = tbl![NomClient]
ElseIf tbl![NomClient] = "TREMCAR ST-CESAIRE INC." Then
CustomerName = tbl![NomClient]
Else
MsgBox "COMMANDE NON TRANSFÉRÉ " & tbl![NoCommande] & "."
clientdiff = 1
GoTo suivant
End If
End If
'On veut aller chercher les informations du client
rstCustomerData.Open "SELECT * FROM Customer where cuName = '" & CustomerName & "'", cnn, adOpenKeyset, adLockOptimistic
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'Pour le calcul des taxes avec le cnn.Execute("CALCULATE_TAXES")
'il faut initialiser un CardPos du groupe de taxe
'On peut donc aller chercher le groupe de taxe auquel le client fait parti
'pour utiliser les bonnes taxes pour le calcul
rstTransactionHeader!InTaxGroupCP = rstCustomerData!CuTaxGroupCP
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
If Not rstCustomerData.EOF Then
rstTransactionHeader!InCustomerSupplierCP = rstCustomerData!RecCardPos
'Adresse de facturation
rstTransactionHeader!InName = rstCustomerData!CuName
rstTransactionHeader!InAddress = rstCustomerData!CuAddress
rstTransactionHeader!InCity = rstCustomerData!CuCity
rstTransactionHeader!InPostalCode = rstCustomerData!CuPostalCode
rstTransactionHeader!InPhoneNumber1 = rstCustomerData!CuPhoneNumber1
rstTransactionHeader!InPhoneNumber2 = rstCustomerData!CuPhoneNumber2
rstTransactionHeader!InPhoneNumber3 = rstCustomerData!CuPhoneNumber3
rstTransactionHeader!InPhoneDescription1 = "Téléphone"
rstTransactionHeader!InPhoneDescription2 = "Télécopieur"
rstTransactionHeader!InPhoneDescription3 = "téléphone"
rstTransactionHeader!InISOCountryCode = rstCustomerData!CuISOCountryCode
If tbl![Devise] = "USD" Then
rstCustomerData2.Open "SELECT * FROM Customer where cuName = '" & CustomerName2 & "'", cnn, adOpenKeyset, adLockOptimistic
If Not rstCustomerData2.EOF Then
'Adresse de livraison
rstTransactionHeader!InShipName = rstCustomerData2!CuName
rstTransactionHeader!InShipAddress = rstCustomerData2!CuAddress
rstTransactionHeader!InShipCity = rstCustomerData2!CuCity
rstTransactionHeader!InShipPostalCode = rstCustomerData2!CuPostalCode
rstTransactionHeader!InShipPhoneNumber1 = rstCustomerData2!CuPhoneNumber1
rstTransactionHeader!InShipPhoneNumber2 = rstCustomerData2!CuPhoneNumber2
rstTransactionHeader!InShipPhoneDescription1 = "Téléphone"
rstTransactionHeader!InShipPhoneDescription2 = "Télécopieur"
rstTransactionHeader!InShipISOCountryCode = rstCustomerData2!CuISOCountryCode
End If
rstCustomerData2.Close
End If
Else
rstTransactionHeader!InCustomerSupplierCP = 0
End If
'Si le client existe
If rstTransactionHeader!InCustomerSupplierCP > 0 Then
'Initialisation des propriétés concernant le client associé à la facture
rstTransactionHeader!InInvoicedToCP = rstCustomerData!CuInvoicedToCP
'Numéro du compte recevable du client auquel la facturation est associée
rstTransactionHeader!InReceivableOffset = rstCustomerData!CuReceivable
End If
'**********************************************************
'Étape 2 : Assigner le nombre total de lignes incluses
' dans la facturation à la propriété TANumLines
'**********************************************************
rstTransactionHeader!TANumLines = tbl![NbrLigne]
rstTransactionHeader.Update
detail:
' Do While Str(tbl![NoCommande]) = vNoCommande
Do While tbl![NoLigne] <= tbl![NbrLigne]
If Str(tbl![NoCommande]) = vNoCommande Then
'**********************************************************
'Étape 3 : Initialiser les propriétés de la première
' ligne de la facturation
'**********************************************************
rstTransactionDetail.Open "SELECT * FROM TransactionDetail where TaNum = " & tbl![NoLigne], cnn, adOpenKeyset, adLockOptimistic
'Pour une commande
rstTransactionDetail!ILType = 2
rstTransactionDetail!IlLineNumber = tbl![NoLigne]
rstTransactionDetail!ILProductNumber = tbl![NoProduit]
rstProductData.Open "SELECT * FROM Product where PrNumber = '" & tbl![NoProduit] & "'", cnn, adOpenKeyset, adLockOptimistic
If Not rstProductData.EOF Then
'Si le produit existe dans l'inventaire, consultation
'de sa fiche pour obtenir les valeurs à assigner aux
'propriétés le concernant dans la facturation
rstTransactionDetail!ILProductCP = rstProductData!RecCardPos
rstTransactionDetail!ILDescription = rstProductData!PrDescription1
rstTransactionDetail!ILSellingPrice = tbl![Prix]
rstTransactionDetail!ILKeepBO = -1
' Ceci est un example pour demontrer comment aller chercher le prix en fonction
' des parametres du client
rstTransactionDetail!ILProductGroupCP = rstProductData!PrProductGroupCP
'Pour une commande
rstTransactionDetail!ILOrderedQty = tbl![Qte]
Else
'Si le produit n'existe pas dans l'inventaire, les valeurs
'à assigner aux propriétés le concernant dans la facturation
'doivent provenir d'une autre source que l'inventaire
'd'Acomba
'Ajoute le produit dans la table Acomba s'il n'existe pas
rstProductData.AddNew
rstProductData![PrNumber] = tbl![NoProduit]
' rstProductData![PrUsed] = -1
rstProductData![PrTimeModified] = Now
rstProductData![PrDescription1] = tbl![Description]
rstProductData![PrSortKey1] = Left(tbl![Description], 15)
' rstProductData![PrSellingPrice0_1] = tbl![Prix]
' rstProductData![PrQtyOrdered] = rstProductData![PrQtyOrdered] + tbl![Qte]
rstProductData![PrQtyOrdered] = tbl![Qte]
rstProductData![PrProductGroupNumber] = 1
rstProductData![PrBoAllowed] = -1
rstProductData![PrActive] = -1
rstProductData.Update
rstProductData.Close
rstProductData.Open "SELECT * FROM Product where PrNumber = '" & tbl![NoProduit] & "'", cnn, adOpenKeyset, adLockOptimistic
If Not rstProductData.EOF Then
rstTransactionDetail!ILProductCP = rstProductData!RecCardPos
End If
rstTransactionDetail!ILDescription = tbl![Description]
rstTransactionDetail!ILSellingPrice = tbl![Prix]
rstTransactionDetail!ILKeepBO = -1
'Le groupe du produit est toujours 1 pour Tremcar
rstTransactionDetail!ILProductGroupCP = 1
'Pour une commande
rstTransactionDetail!ILOrderedQty = tbl![Qte]
End If
rstTransactionDetail.Update
rstTransactionDetail.Close
rstProductData.Close
Else
Exit Do
End If
tbl.MoveNext
If tbl.EOF Then
Exit Do
End If
Loop
rstTransactionHeader.Close
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' Calcul de taxe
'On peut effectuer le calcul des taxes et y avoir accès avant la finalisation de la facture
'Voici un exemple avec lequel on calcul les taxes et on ajoute par la suite une ligne de transport
'il est possible aussi de calculer les taxes, ajouter des produits, et recalculer les taxes
'On recalcule les taxes en incluant la ligne de transport
cnn.Execute ("CALCULATE_TAXES")
'On veut avoir accès aux montants des taxes fraiches calculées Avant l'exécution du END_TRANSACTION_IN
rstCurrentTaxes.Open "select * from LastTransactionDetail where ILType = 8", cnn, adOpenKeyset, adLockOptimistic
Amount = rstCurrentTaxes!ILTotalAmount
Amount = rstCurrentTaxes!ILType
rstCurrentTaxes.MoveNext
Amount = rstCurrentTaxes!ILTotalAmount
Amount = rstCurrentTaxes!ILType
rstCurrentTaxes.Close
rstCustomerData.Close
'Terminer la création de la transaction
cnn.Execute ("END_TRANSACTION_IN")
If tbl.EOF Then
Exit Do
Else
vNoCommande = Str(tbl![NoCommande])
End If
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' Si on veut obtenir des informations sur le dernier header créé,
' les informations se trouvent dans le LastTransactionHeader
' On veut particulièrement obtenir le CardPos de la transaction une fois créée
' afin de faire des opérations sur celle-ci
' Toutes autres informations sont aussi disponibles
rstLastTransHeader.Open "select * from LastTransactionHeader", cnn, adOpenKeyset, adLockOptimistic
CardPos = rstLastTransHeader!RecCardPos ' <---------
InvoiceTotal = rstLastTransHeader!InInvoiceTotal
SupplierCP = rstLastTransHeader!InCustomerSupplierCP
rstLastTransHeader.Close
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' Si on veut obtenir des informations sur les lignes de taxes,
' les informations se trouvent dans le LastTransactionDetail (Ainsi que d'autres informations de lignes)
rstLastTransDetail.Open "select * from LastTransactionDetail where ILType = 8", cnn, adOpenKeyset, adLockOptimistic
'premiere ligne de taxe
Amount = rstLastTransDetail!ILTotalAmount
'deuxieme ligne de taxe
rstLastTransDetail.MoveNext
Amount = rstLastTransDetail!ILTotalAmount
rstLastTransDetail.Close
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
suivant:
'Si la commande exite dans Acomba passe au suivant
If trouve = 1 Or clientdiff = 1 Then
tbl.MoveNext
vNoCommande = Str(tbl![NoCommande])
rstTransactionHeader.Close
End If
Loop
tbl.Close
'Empêche les demande de confirmation de s'afficher
'DoCmd.SetWarnings False
'
''Efface le contenu de la table
'DoCmd.RunSQL "DELETE * FROM tmpCommande;"
'
''Retablit les confirmations
'DoCmd.SetWarnings True
MsgBox "Exportation des commandes vers Acomba terminé."
ExportationAcomba_Exit:
cnn.Close
Exit Sub
ExportationAcomba_Err:
MsgBox Err.Description
cnn.Execute ("CANCEL_TRANSACTION_IN")
Resume ExportationAcomba_Exit
End Sub
Donc tel que mentionné c'est la ligne rstTransactionDetail.Update
de la 6ieme ligne de commande qui plante.
Merci
****** CODE *********
Sub ExportationAcomba()
'Déclaration des variables
Dim strsql As String
Dim tbl As DAO.Recordset
Dim cnn As New ADODB.Connection
Dim rstTransactionHeader As New ADODB.Recordset
Dim rstTransactionDetail As New ADODB.Recordset
Dim rstCustomerData As New ADODB.Recordset
Dim rstCustomerData2 As New ADODB.Recordset
Dim rstProductData As New ADODB.Recordset
Dim rstProductGroup As New ADODB.Recordset
Dim rstCurrentTaxes As New ADODB.Recordset
Dim rstLastTransHeader As New ADODB.Recordset
Dim rstLastTransDetail As New ADODB.Recordset
Dim Numero As String
Dim trouve As Integer
Dim clientdiff As Integer
Dim vProduit As String
Dim vDescription As String
Dim vNoCommande As String
cnn.ConnectionString = "DSN=DEMO"
'cnn.ConnectionString = "DSN=RAYNOX"
cnn.CursorLocation = adUseClient
cnn.Open
On Error GoTo ExportationAcomba_Err
strsql = "tmpCommande"
Set tbl = CurrentDb.OpenRecordset(strsql)
tbl.MoveFirst
vNoCommande = Str(tbl![NoCommande])
'Boucle tant qu'il y a des commandes dans la table tmpCommande
Do Until tbl.EOF
cnn.Execute ("BEGIN_TRANSACTION_IN")
rstTransactionHeader.Open "SELECT * FROM TransactionHeader", cnn, adOpenKeyset, adLockOptimistic
trouve = 0
clientdiff = 0
'Vérifie si la commande existe dans la table TransactionHeader d'Acomba
Do Until rstTransactionHeader.EOF
If Trim(rstTransactionHeader![InAssociatedOrder]) = tbl![NoCommande] Then
trouve = 1
MsgBox "La commande " & tbl![NoCommande] & " est déjà créée dans Acomba. À VÉRIFIER!!!"
GoTo suivant
End If
If Trim(rstTransactionHeader![InInvoiceNumber]) = tbl![NoCommande] Then
trouve = 1
MsgBox "La commande " & tbl![NoCommande] & " est déjà créée dans Acomba. À VÉRIFIER!!!"
GoTo suivant
End If
rstTransactionHeader.MoveNext
Loop
rstTransactionHeader.AddNew
'Pour une commande
rstTransactionHeader!InInvoiceType = 2
'rstTransactionHeader!InReference = ""
rstTransactionHeader!InReference = "PO # " & tbl![NoCommande] & " - " & Left(tbl![Instructions], 13)
rstTransactionHeader!InDescription = tbl![Instructions]
rstTransactionHeader!InCurrentDay = 1
rstTransactionHeader!InDate = tbl![DateCommande]
rstTransactionHeader!InTransactionActive = 1
rstTransactionHeader![InInvoiceNumber] = tbl![NoCommande]
If tbl![ExpedieVia] = "Votre camion" Then
rstTransactionHeader!InShippingNumber = 1
rstTransactionHeader!InShippingCP = 1
End If
'Nom du client associé à la facture
If tbl![Devise] = "USD" Then
CustomerName = "TREMCAR INC. - ($ us)"
CustomerName2 = "TREMCAR ST-CESAIRE INC."
Else
If tbl![NomClient] = "TREMCAR IBERVILLE" Then
CustomerName = "TREMCAR INC."
' ElseIf tbl![NomClient] = "HUTCHINSON INDUSTRIES" Then
' CustomerName = "HUTCHINSON INDUSTRIES CANADA"
' Else
' CustomerName = tbl![NomClient]
ElseIf tbl![NomClient] = "TREMCAR ST-CESAIRE INC." Then
CustomerName = tbl![NomClient]
Else
MsgBox "COMMANDE NON TRANSFÉRÉ " & tbl![NoCommande] & "."
clientdiff = 1
GoTo suivant
End If
End If
'On veut aller chercher les informations du client
rstCustomerData.Open "SELECT * FROM Customer where cuName = '" & CustomerName & "'", cnn, adOpenKeyset, adLockOptimistic
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'Pour le calcul des taxes avec le cnn.Execute("CALCULATE_TAXES")
'il faut initialiser un CardPos du groupe de taxe
'On peut donc aller chercher le groupe de taxe auquel le client fait parti
'pour utiliser les bonnes taxes pour le calcul
rstTransactionHeader!InTaxGroupCP = rstCustomerData!CuTaxGroupCP
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
If Not rstCustomerData.EOF Then
rstTransactionHeader!InCustomerSupplierCP = rstCustomerData!RecCardPos
'Adresse de facturation
rstTransactionHeader!InName = rstCustomerData!CuName
rstTransactionHeader!InAddress = rstCustomerData!CuAddress
rstTransactionHeader!InCity = rstCustomerData!CuCity
rstTransactionHeader!InPostalCode = rstCustomerData!CuPostalCode
rstTransactionHeader!InPhoneNumber1 = rstCustomerData!CuPhoneNumber1
rstTransactionHeader!InPhoneNumber2 = rstCustomerData!CuPhoneNumber2
rstTransactionHeader!InPhoneNumber3 = rstCustomerData!CuPhoneNumber3
rstTransactionHeader!InPhoneDescription1 = "Téléphone"
rstTransactionHeader!InPhoneDescription2 = "Télécopieur"
rstTransactionHeader!InPhoneDescription3 = "téléphone"
rstTransactionHeader!InISOCountryCode = rstCustomerData!CuISOCountryCode
If tbl![Devise] = "USD" Then
rstCustomerData2.Open "SELECT * FROM Customer where cuName = '" & CustomerName2 & "'", cnn, adOpenKeyset, adLockOptimistic
If Not rstCustomerData2.EOF Then
'Adresse de livraison
rstTransactionHeader!InShipName = rstCustomerData2!CuName
rstTransactionHeader!InShipAddress = rstCustomerData2!CuAddress
rstTransactionHeader!InShipCity = rstCustomerData2!CuCity
rstTransactionHeader!InShipPostalCode = rstCustomerData2!CuPostalCode
rstTransactionHeader!InShipPhoneNumber1 = rstCustomerData2!CuPhoneNumber1
rstTransactionHeader!InShipPhoneNumber2 = rstCustomerData2!CuPhoneNumber2
rstTransactionHeader!InShipPhoneDescription1 = "Téléphone"
rstTransactionHeader!InShipPhoneDescription2 = "Télécopieur"
rstTransactionHeader!InShipISOCountryCode = rstCustomerData2!CuISOCountryCode
End If
rstCustomerData2.Close
End If
Else
rstTransactionHeader!InCustomerSupplierCP = 0
End If
'Si le client existe
If rstTransactionHeader!InCustomerSupplierCP > 0 Then
'Initialisation des propriétés concernant le client associé à la facture
rstTransactionHeader!InInvoicedToCP = rstCustomerData!CuInvoicedToCP
'Numéro du compte recevable du client auquel la facturation est associée
rstTransactionHeader!InReceivableOffset = rstCustomerData!CuReceivable
End If
'**********************************************************
'Étape 2 : Assigner le nombre total de lignes incluses
' dans la facturation à la propriété TANumLines
'**********************************************************
rstTransactionHeader!TANumLines = tbl![NbrLigne]
rstTransactionHeader.Update
detail:
' Do While Str(tbl![NoCommande]) = vNoCommande
Do While tbl![NoLigne] <= tbl![NbrLigne]
If Str(tbl![NoCommande]) = vNoCommande Then
'**********************************************************
'Étape 3 : Initialiser les propriétés de la première
' ligne de la facturation
'**********************************************************
rstTransactionDetail.Open "SELECT * FROM TransactionDetail where TaNum = " & tbl![NoLigne], cnn, adOpenKeyset, adLockOptimistic
'Pour une commande
rstTransactionDetail!ILType = 2
rstTransactionDetail!IlLineNumber = tbl![NoLigne]
rstTransactionDetail!ILProductNumber = tbl![NoProduit]
rstProductData.Open "SELECT * FROM Product where PrNumber = '" & tbl![NoProduit] & "'", cnn, adOpenKeyset, adLockOptimistic
If Not rstProductData.EOF Then
'Si le produit existe dans l'inventaire, consultation
'de sa fiche pour obtenir les valeurs à assigner aux
'propriétés le concernant dans la facturation
rstTransactionDetail!ILProductCP = rstProductData!RecCardPos
rstTransactionDetail!ILDescription = rstProductData!PrDescription1
rstTransactionDetail!ILSellingPrice = tbl![Prix]
rstTransactionDetail!ILKeepBO = -1
' Ceci est un example pour demontrer comment aller chercher le prix en fonction
' des parametres du client
rstTransactionDetail!ILProductGroupCP = rstProductData!PrProductGroupCP
'Pour une commande
rstTransactionDetail!ILOrderedQty = tbl![Qte]
Else
'Si le produit n'existe pas dans l'inventaire, les valeurs
'à assigner aux propriétés le concernant dans la facturation
'doivent provenir d'une autre source que l'inventaire
'd'Acomba
'Ajoute le produit dans la table Acomba s'il n'existe pas
rstProductData.AddNew
rstProductData![PrNumber] = tbl![NoProduit]
' rstProductData![PrUsed] = -1
rstProductData![PrTimeModified] = Now
rstProductData![PrDescription1] = tbl![Description]
rstProductData![PrSortKey1] = Left(tbl![Description], 15)
' rstProductData![PrSellingPrice0_1] = tbl![Prix]
' rstProductData![PrQtyOrdered] = rstProductData![PrQtyOrdered] + tbl![Qte]
rstProductData![PrQtyOrdered] = tbl![Qte]
rstProductData![PrProductGroupNumber] = 1
rstProductData![PrBoAllowed] = -1
rstProductData![PrActive] = -1
rstProductData.Update
rstProductData.Close
rstProductData.Open "SELECT * FROM Product where PrNumber = '" & tbl![NoProduit] & "'", cnn, adOpenKeyset, adLockOptimistic
If Not rstProductData.EOF Then
rstTransactionDetail!ILProductCP = rstProductData!RecCardPos
End If
rstTransactionDetail!ILDescription = tbl![Description]
rstTransactionDetail!ILSellingPrice = tbl![Prix]
rstTransactionDetail!ILKeepBO = -1
'Le groupe du produit est toujours 1 pour Tremcar
rstTransactionDetail!ILProductGroupCP = 1
'Pour une commande
rstTransactionDetail!ILOrderedQty = tbl![Qte]
End If
rstTransactionDetail.Update
rstTransactionDetail.Close
rstProductData.Close
Else
Exit Do
End If
tbl.MoveNext
If tbl.EOF Then
Exit Do
End If
Loop
rstTransactionHeader.Close
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' Calcul de taxe
'On peut effectuer le calcul des taxes et y avoir accès avant la finalisation de la facture
'Voici un exemple avec lequel on calcul les taxes et on ajoute par la suite une ligne de transport
'il est possible aussi de calculer les taxes, ajouter des produits, et recalculer les taxes
'On recalcule les taxes en incluant la ligne de transport
cnn.Execute ("CALCULATE_TAXES")
'On veut avoir accès aux montants des taxes fraiches calculées Avant l'exécution du END_TRANSACTION_IN
rstCurrentTaxes.Open "select * from LastTransactionDetail where ILType = 8", cnn, adOpenKeyset, adLockOptimistic
Amount = rstCurrentTaxes!ILTotalAmount
Amount = rstCurrentTaxes!ILType
rstCurrentTaxes.MoveNext
Amount = rstCurrentTaxes!ILTotalAmount
Amount = rstCurrentTaxes!ILType
rstCurrentTaxes.Close
rstCustomerData.Close
'Terminer la création de la transaction
cnn.Execute ("END_TRANSACTION_IN")
If tbl.EOF Then
Exit Do
Else
vNoCommande = Str(tbl![NoCommande])
End If
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' Si on veut obtenir des informations sur le dernier header créé,
' les informations se trouvent dans le LastTransactionHeader
' On veut particulièrement obtenir le CardPos de la transaction une fois créée
' afin de faire des opérations sur celle-ci
' Toutes autres informations sont aussi disponibles
rstLastTransHeader.Open "select * from LastTransactionHeader", cnn, adOpenKeyset, adLockOptimistic
CardPos = rstLastTransHeader!RecCardPos ' <---------
InvoiceTotal = rstLastTransHeader!InInvoiceTotal
SupplierCP = rstLastTransHeader!InCustomerSupplierCP
rstLastTransHeader.Close
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' Si on veut obtenir des informations sur les lignes de taxes,
' les informations se trouvent dans le LastTransactionDetail (Ainsi que d'autres informations de lignes)
rstLastTransDetail.Open "select * from LastTransactionDetail where ILType = 8", cnn, adOpenKeyset, adLockOptimistic
'premiere ligne de taxe
Amount = rstLastTransDetail!ILTotalAmount
'deuxieme ligne de taxe
rstLastTransDetail.MoveNext
Amount = rstLastTransDetail!ILTotalAmount
rstLastTransDetail.Close
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
suivant:
'Si la commande exite dans Acomba passe au suivant
If trouve = 1 Or clientdiff = 1 Then
tbl.MoveNext
vNoCommande = Str(tbl![NoCommande])
rstTransactionHeader.Close
End If
Loop
tbl.Close
'Empêche les demande de confirmation de s'afficher
'DoCmd.SetWarnings False
'
''Efface le contenu de la table
'DoCmd.RunSQL "DELETE * FROM tmpCommande;"
'
''Retablit les confirmations
'DoCmd.SetWarnings True
MsgBox "Exportation des commandes vers Acomba terminé."
ExportationAcomba_Exit:
cnn.Close
Exit Sub
ExportationAcomba_Err:
MsgBox Err.Description
cnn.Execute ("CANCEL_TRANSACTION_IN")
Resume ExportationAcomba_Exit
End Sub
- PlanteG
- Nombre de messages : 1024
Ville : Québec
Date d'inscription : 11/07/2007
Fiche d'Entreprise
Nom de l'entreprise: Informatique Gilles Plante
RE: COMMANDE DANS ACOMBA PAR ACCESS
Mer 24 Nov 2010 - 16:08
Hum,
il y a pas mal de code là-dedans . Ça ressemble passablement au code exemple dans le fichier d'aide, et comme ça marche dans plusieurs cas, il y a lieu de croire que la base serait correcte.
J'ai quelques commentaires/questions, espérons qu'il vous mettront sur la piste.
Au début de detail:, on voit:
Do While tbl![NoLigne] <= tbl![NbrLigne]
If Str(tbl![NoCommande]) = vNoCommande Then
J'en conclus donc qu'il n'y a qu'une seule table avec les entêtes et les détails. Est-ce exact ? Si c'est le cas, cela implique que tous les enregistrements d'une même commande sont contigus et en ordre croissant de [NoLigne]. Sauf que si la requête ne les retourne pas dans le bon ordre, il y aura un os dans la moulinette. Ne serait-il pas alors préférable d'emplir tbl en spécifiant un tri croissant sur le no de commande puis le no de ligne ?
D'un autre côté, le message d'erreur pourrait laisser entendre qu'une même ligne serait créée plus d'une fois. À condition bien sûr que vous ne soyez pas victime du syndrome du mauvais message d'erreur . J'ai malheureusement vécu cela déjà... Oh et le message d'erreur laisse entendre que c'est une mise à jour, pas la création d'une nouvelle entrée. Bizarre...
il y a pas mal de code là-dedans . Ça ressemble passablement au code exemple dans le fichier d'aide, et comme ça marche dans plusieurs cas, il y a lieu de croire que la base serait correcte.
J'ai quelques commentaires/questions, espérons qu'il vous mettront sur la piste.
Au début de detail:, on voit:
Do While tbl![NoLigne] <= tbl![NbrLigne]
If Str(tbl![NoCommande]) = vNoCommande Then
J'en conclus donc qu'il n'y a qu'une seule table avec les entêtes et les détails. Est-ce exact ? Si c'est le cas, cela implique que tous les enregistrements d'une même commande sont contigus et en ordre croissant de [NoLigne]. Sauf que si la requête ne les retourne pas dans le bon ordre, il y aura un os dans la moulinette. Ne serait-il pas alors préférable d'emplir tbl en spécifiant un tri croissant sur le no de commande puis le no de ligne ?
D'un autre côté, le message d'erreur pourrait laisser entendre qu'une même ligne serait créée plus d'une fois. À condition bien sûr que vous ne soyez pas victime du syndrome du mauvais message d'erreur . J'ai malheureusement vécu cela déjà... Oh et le message d'erreur laisse entendre que c'est une mise à jour, pas la création d'une nouvelle entrée. Bizarre...
- lboisvert
- Nombre de messages : 8
Date d'inscription : 19/07/2010
RE: Commande dans Acomba par Access
Mer 24 Nov 2010 - 16:37
Bonjour,
Merci de me répondre rapidement.
Il n'y a effectivement qu'une seule table avec les entêtes et les détails et la table est indexé par no de commande. Pour le numéro de ligne l'ordre est établie par un programme qui inscrit le numéro de ligne sur chaque ligne d'une commande en faisant première ligne de la commande noligne = 1, deuxième ligne de la commande noligne = 2 etc...
Quand j'utilise l'option de débogage avec F8 tout semble ok.
Le problème est intermittant, il n'est pas systématique à chaque fois que j'ai une commande de plusieurs lignes. J'ai remarqué qu'il a déjà planté lorsque la dernière ligne de la commande était un nouveau produit que j'ajoute par le même programme. Ensuite lorsque je l'ai réexécuter la commande a réussi à passer probablement parce que le produit était maintenant créé. En même temps je ne sait pas si ça peux être ça parce que sur d'autre commande dont le produit est nouveau cela a bien passé.
Avez-vous d'autres idée???
Merci
Merci de me répondre rapidement.
Il n'y a effectivement qu'une seule table avec les entêtes et les détails et la table est indexé par no de commande. Pour le numéro de ligne l'ordre est établie par un programme qui inscrit le numéro de ligne sur chaque ligne d'une commande en faisant première ligne de la commande noligne = 1, deuxième ligne de la commande noligne = 2 etc...
Quand j'utilise l'option de débogage avec F8 tout semble ok.
Le problème est intermittant, il n'est pas systématique à chaque fois que j'ai une commande de plusieurs lignes. J'ai remarqué qu'il a déjà planté lorsque la dernière ligne de la commande était un nouveau produit que j'ajoute par le même programme. Ensuite lorsque je l'ai réexécuter la commande a réussi à passer probablement parce que le produit était maintenant créé. En même temps je ne sait pas si ça peux être ça parce que sur d'autre commande dont le produit est nouveau cela a bien passé.
Avez-vous d'autres idée???
Merci
- Jeremie
- Nombre de messages : 123
Date d'inscription : 11/08/2010
Fiche d'Entreprise
Nom de l'entreprise:
Re: Commande dans Acomba par Access
Mer 24 Nov 2010 - 17:07
Bonjour,
Je n'ai pas lu le code en entier ... il y a n'a un peux trop et j'ai le flegme de faire la conversion VBA vers .net
Ensuite, j'ai eu le même problème, mais moi c'étais dès la deuxième ligne.
Alors se que les programmeur Acomba ont finis par me donner, c'est une fonction en pseudo .Net
avec la particularité qu'il traité le détail deux fois.
La seul chose que j'ai modifié est le fait que je n'utilise plus d'ADODB depuis 2001.
Et pour que cela fonctionne en VBA, faudra retirer les try catch si ma mémoire est bonne.
Je fait rarement de VBA, mais mon premier poste de Programmeur n'étais que ça du VBA.
Avant de mettre les donnée dans le détail, il créé la ligne vide.
dans mon cas. j'ai enlever l'aspect linéaire pour englobé dans des for.
Se qui donne quelques chose qui ressemble à ceci.
Ça devrait fonctionner, mais j'avoue ne pas avoir essayé avec plus de 4 items.
En gros, l'exemple qui est donnée dans le fichier d'aide est incomplète.
Si vous êtes intéressé, je peux mettre le code complet que j'ai finis par avoir.
Après deux ou trois semaines à leur envoyer des oui, mais non ça fonctionne pas.
Edit :
Je viens de lire votre dernier post.
oui, le produit dois avoir été créé AVANt de faire la commande.
Je n'ai pas lu le code en entier ... il y a n'a un peux trop et j'ai le flegme de faire la conversion VBA vers .net
Ensuite, j'ai eu le même problème, mais moi c'étais dès la deuxième ligne.
Alors se que les programmeur Acomba ont finis par me donner, c'est une fonction en pseudo .Net
avec la particularité qu'il traité le détail deux fois.
La seul chose que j'ai modifié est le fait que je n'utilise plus d'ADODB depuis 2001.
Et pour que cela fonctionne en VBA, faudra retirer les try catch si ma mémoire est bonne.
Je fait rarement de VBA, mais mon premier poste de Programmeur n'étais que ça du VBA.
Avant de mettre les donnée dans le détail, il créé la ligne vide.
dans mon cas. j'ai enlever l'aspect linéaire pour englobé dans des for.
Se qui donne quelques chose qui ressemble à ceci.
- Code:
'Faut créé les ligne avant.
For i = 0 To iNbLot
sRequest = "UPDATE TransactionDetail SET ILType=0, " & _
"ILLineNumber=0,ILProjectCP=0, ILCharterCP=0, " & _
"ILProductNumber='',ILProductGroupNumber=0, " & _
"ILDescription='',ILSellingPrice=0, ILProductCPLinkedToSerialNumber=0, " & _
"ILSerialNumberType=0, ILProductItemCP=0, ILProductItemCategory3='', " & _
"ILProductItemDescriptor1='', ILProductItemDescriptor2='', ILIsQuantity=0, " & _
"ILPriceList=0,ILPriceBeforeDiscount=0, ILDiscountPercent=0, ILDiscountPriceLevel=0, " & _
"ILKeepBO=0, ILBypassPrinting=0, ILTaxLineRate1=0, ILTaxLineRate2=0, " & _
"ILTaxLineRate3=0, ILTaxLineRate4=0, ILTaxLineRate5=0, ILUnitTaxAmount1=0, " & _
"ILUnitTaxAmount2=0, ILUnitTaxAmount3=0,ILUnitTaxAmount4=0,ILUnitTaxAmount5=0, " & _
"ILTotalAmount=0 WHERE TaNum = " & i + 1
objAcomba.executeSave(sRequest)
Next
For i = 0 To iNbLot
'Aller chercher les information sur le produit.
sRequest = "SELECT * from Product Where PrNumber = '" & dgDetail.Item(i, 1) & "'"
dtProduct = objAcomba.executeSelect(sRequest).Tables(0)
If dtProduct.Rows.Count > 0 Then
sRequest = "UPDATE TransactionDetail SET " _
& " ILType = 2, ILLineNumber = " & i + 1 & "," _
& " ILCustomerSupplierCP = " & iCustomerCU & ", " _
& " ILDate = {d '" & Today.ToString("yyyy-MM-dd") & "'}" _
& ", ILDescription = '" & dtProduct.Rows(0).Item("PrDescription1") _
& "',ILProductGroupNumber = " & dtProduct.Rows(0).Item("PrProductGroupNumber") _
& ", ILProductCP = " & dtProduct.Rows(0).Item("RecCardPos") _
& ",ILProductNumber = '" & dgDetail.Item(i, 1) _
& "',ILOrderedQty = " & dgDetail.Item(i, 3) _
& ", ILCost = " & dtProduct.Rows(0).Item("PrLastCost") & ", ILSellingPrice = " & dgDetail.Item(i, 7) _
& " Where TaNum = " & i + 1
If Not objAcomba.executeSave(sRequest) Then
bOk = False
Exit For
End If
End If
Next i
Ça devrait fonctionner, mais j'avoue ne pas avoir essayé avec plus de 4 items.
En gros, l'exemple qui est donnée dans le fichier d'aide est incomplète.
Si vous êtes intéressé, je peux mettre le code complet que j'ai finis par avoir.
Après deux ou trois semaines à leur envoyer des oui, mais non ça fonctionne pas.
- Code:
'Objet utilisé pour utiliser la source de données ODBC
Dim cnn As New ADODB.Connection
'Recordset utilisé pour obtenir le numéro de la dernière
'commande qui a été créée
Dim rstLastTransHeader As New ADODB.Recordset
'Contient le numéro de la dernière commande créée
Dim Numero As String
'Recorset utilisé pour obtenir le CardPos du groupe de taxes
'du client
Dim rstCustomer As New ADODB.Recordset
'Contient CardPos du groupe de taxes du client
Dim CardPosTaxGroup As Long
'Variable utilisées pour consulter les lignes de taxes qui
'ont été générées lors de l'exécution de CALCULATE_TAXES
Dim NoTaxe As String
Dim DescTaxe As String
Dim MtTaxe As Double
Dim TypeTaxe As Long
Err.Clear()
cnn.ConnectionString = "DSN=Demo"
cnn.CursorLocation = ADODB.CursorLocationEnum.adUseClient
Try
'Indique qu'on veut créer une facturation
cnn.Execute("BEGIN_TRANSACTION_IN")
'Création de l'entête de la facturation de type commande
cnn.Execute("INSERT INTO TransactionHeader(InInvoiceType, InReference, InDescription, InCurrentDay, InTransactionActive, InTaxGroupCP, InCustomerSupplierNumber, InDate, InReceivableOffset, TANumLines) " & _
"VALUES (2, 'Commande du site Web par ODBC', 'Commande du site Web par ODBC', 1, 1, " & CardPosTaxGroup & ", '5222546', {D '2010-11-10'}, 0, 1)")
'-------------------------------------------------------------------------
'Tout d'abord, en modification de facturation, il est de bonne pratique
'de s'assurer que tous les champs de la nouvelle ligne sont à vides.
'Ainsi, on met d'abord à vide tous les champs des nouvelles lignes de
'produit.
'-------------------------------------------------------------------------
'Mettre à vide les champs de la ligne qui sera la première
'nouvelle ligne de produit (TaNum = 2)
cnn.Execute("UPDATE TransactionDetail SET ILType=0, " & _
"ILLineNumber=0, " & _
"ILProjectCP=0, " & _
"ILCharterCP=0, " & _
"ILProductNumber='', " & _
"ILProductGroupNumber=0, " & _
"ILDescription='', " & _
"ILSellingPrice=0, " & _
"ILProductCPLinkedToSerialNumber=0, " & _
"ILSerialNumberType=0, " & _
"ILProductItemCP=0, " & _
"ILProductItemCategory1='', " & _
"ILProductItemCategory2='', " & _
"ILProductItemCategory3='', " & _
"ILProductItemDescriptor1='', " & _
"ILProductItemDescriptor2='', " & _
"ILProductItemDescriptor3='', " & _
"ILProductSupplierCP=0, " & _
"ILInvoicedQty=0, " & _
"ILOrderedQty=0, " & _
"ILCost=0, " & _
"ILIsQuantity=0, " & _
"ILPriceList=0, " & _
"ILPriceBeforeDiscount=0, " & _
"ILDiscountPercent=0, " & _
"ILDiscountPriceLevel=0, " & _
"ILKeepBO=0, " & _
"ILBypassPrinting=0, " & _
"ILTaxLineRate1=0, " & _
"ILTaxLineRate2=0, " & _
"ILTaxLineRate3=0, " & _
"ILTaxLineRate4=0, " & _
"ILTaxLineRate5=0, " & _
"ILUnitTaxAmount1=0, " & _
"ILUnitTaxAmount2=0, " & _
"ILUnitTaxAmount3=0, " & _
"ILUnitTaxAmount4=0, " & _
"ILUnitTaxAmount5=0, " & _
"ILTotalAmount=0 " & _
"WHERE (TaNum = 2)")
'Ajout d'une ligne dans la commande
cnn.Execute("UPDATE TransactionDetail SET ILType=2, " & _
"ILLineNumber=1, " & _
"ILProductCP=2, " & _
"ILProductNumber='CARTOUCHE', " & _
"ILProductGroupNumber=2, " & _
"ILDescription='Cartouche pour imprimante', " & _
"ILOrderedQty=5, " & _
"ILSellingPrice=48.04" &
"WHERE(TaNum = 1)")
'Indique de calculer les taxes pour la commande
cnn.Execute("CALCULATE_TAXES")
'Indique de créer la commande
cnn.Execute("END_TRANSACTION_IN")
MsgBox("Factruration de type commande créée avec succès.")
'------------------------------------------------
'Obtenir le numéro de la commande qui a été créée
'------------------------------------------------
'Obtenir l'enregistrement qui a été ajoutée dans
'la table LastTransactionHeader
rstLastTransHeader.Open("SELECT * FROM LastTransactionHeader", cnn, ADODB.CursorTypeEnum.adOpenKeyset, ADODB.LockTypeEnum.adLockOptimistic)
'Assigner à Numero le numéro de la dernière commande
Numero = rstLastTransHeader.Fields("InInvoiceNumber").Value
rstLastTransHeader.Close()
Catch
If Err.Number <> 0 Then
MsgBox(Err.Description)
End If
Finally
cnn.Close()
End Try
Edit :
Je viens de lire votre dernier post.
oui, le produit dois avoir été créé AVANt de faire la commande.
- lboisvert
- Nombre de messages : 8
Date d'inscription : 19/07/2010
Commande dans Acomba par Access
Jeu 25 Nov 2010 - 10:08
Bonjour à tous,
Merci pour vos réponses!!
J'ai effectivement pensé hier soir à modifier mon code pour créer les produits avant de créer les commandes tel que proposé par Jeremie donc ta proposition confirme mon idée.
Après l'avoir testé cela a l'air de bien fonctionné.
Je l'essaie encore pour un temps et on verra.
Merci et bonne journée!!
Merci pour vos réponses!!
J'ai effectivement pensé hier soir à modifier mon code pour créer les produits avant de créer les commandes tel que proposé par Jeremie donc ta proposition confirme mon idée.
Après l'avoir testé cela a l'air de bien fonctionné.
Je l'essaie encore pour un temps et on verra.
Merci et bonne journée!!
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum