Help!

PC-Problemen?
De vrijwilligers van Oplossing.be zoeken gratis met u mee!

Hulp bij posten

Recente topics

Auteur Topic: VBA en SQL  (gelezen 7992 keer)

0 leden en 1 gast bekijken dit topic.

Offline Maurann

  • Volledig lid
  • **
  • Berichten: 166
VBA en SQL
« Gepost op: 22 maart 2010, 15:21:51 »
Wil in VBA waarden uit een query doorgeven aan de volgende SQLstring.
De waarden worden gehaald uit recordset qryVoorraad. waarde: productId en teldatum.
Deze query moet door de code met een loop worden doorgegaan, de waarden moeten worden doorgegeven
aan een sqlstring. Ergens geeft de code de waarde niet door.
Kan iemand eens een handje helpen?


Dim strsql As String
Dim rs As ADODB.Recordset
Dim cnn As New ADODB.Connection
Dim Teller As Integer
Dim A As Integer
Dim spe As Long
Dim gro As Date
Dim tek As Long

New ADODB.Recordset
Set cnn = CurrentProject.Connection
rs.Open "QryVoorraad", cnn, adOpenStatic,
acCmdTable
rs.MoveLast
Teller = rs.RecordCount
rs.MoveFirst
For A = 1 To Teller

spe = rs.Fields("ProductId")
gro = rs.Fields("Teldatum")


strsql = "SELECT [Voorraad]+(Sum([orderdetail.mutaantalin]-[orderdetail.aantal]))-[Minvoorraad] AS Tekort, Orderdetail.ProductId, Sum(Orderdetail.MutAantalIn) AS SomVanMutAantalIn, Sum(Orderdetail.Aantal) AS Verkocht, Product.Voorraad, Product.Minvoorraad" _
& "FROM Product INNER JOIN (Orders INNER JOIN Orderdetail ON Orders.Orderid = Orderdetail.OrderId) ON Product.ProductId = Orderdetail.ProductId" _
& "WHERE (((Orders.Orderdatum) >= " & [gro] &  ")) And ProductId = " & spe & ""  "


tek = rs.Fields("tekort")


strsql = "INSERT INTO tblTelling ( ProductId, Tekort ) " _
& " Values(" & spe & ",'" & tek & "' )"



 DoCmd.SetWarnings (False)
DoCmd.RunSQL strsql
DoCmd.SetWarnings (True)
rs.MoveNext

Next A
rs.Close
cnn.Close
 Set rs = Nothing
    Set cnn = Nothing
       

 

   
 
Standaard emailprogramma: Outlook Express
Standaard Operating System: Windows XP SP2
Standaard Browser:Internet Explorer 7

Offline dizzl

  • Ambassadeur
  • *****
  • Berichten: 2.346
  • I've Upped my standards,now,up yours!
Re: VBA en SQL
« Reactie #1 Gepost op: 22 maart 2010, 16:28:57 »
t zou gemakkelijker zijn als ik meteen in je database kon werken maar wat me opvalt is dat je strSQL telkens in de herhaling zet

'Maak je query
strsql = "SELECT [Voorraad]+(Sum([orderdetail.mutaantalin]-[orderdetail.aantal]))-[Minvoorraad] AS Tekort, Orderdetail.ProductId, Sum(Orderdetail.MutAantalIn) AS SomVanMutAantalIn, Sum(Orderdetail.Aantal) AS Verkocht, Product.Voorraad, Product.Minvoorraad" _
& "FROM Product INNER JOIN (Orders INNER JOIN Orderdetail ON Orders.Orderid = Orderdetail.OrderId) ON Product.ProductId = Orderdetail.ProductId" _
& "WHERE (((Orders.Orderdatum) >= " & [gro] & ")) And ProductId = " & spe & "" "

rs.Open strSQL, cnn, adOpenStatic, acCmdTable '<----- strSQL ipv "queryVoorraa"
rs.MoveLast
Teller = rs.RecordCount
rs.MoveFirst
while not rs.eof 'zolang er records zijn'
  spe = rs.Fields("ProductId")
  gro = rs.Fields("Teldatum")
  tek = rs.Fields("tekort")

  'voeg dit record toe aan de tabel
  strsql = "INSERT INTO tblTelling ( ProductId, Tekort ) " _
& " Values(" & spe & ",'" & tek & "' )"
  docmd.RunSQL strSQL


   rs.MoveNext
wend

Is productID een tekst of een numerieke (autonummering of geheel getal) type?

(((Orders.Orderdatum) >= " & [gro] & "))
zou omdat het een datum is tussen hekjes staan
(((Orders.Orderdatum) >= # & gro & "#)
en [gro] daar mogen geen rechte haakjes staan omdat het geen veld uit een tabel maar een naam van een variabele is.

And ProductId = " & spe & "" "
moet ofwel
 And ProductId = '"& spe & "'"
of
 nd ProductId = " & spe
zijn

ENKELE aanhalingstekens als het tekst is
GEEN aanhalingstekens als het een cijferwaarde is.

Systeem  : Intel Core i5-4440 3.1Ghz, 3.1GHz 16Giga Ram 64Bits
Software : Windows 10 professional, Avira, Office 2016 Professional

Offline Maurann

  • Volledig lid
  • **
  • Berichten: 166
Re: VBA en SQL
« Reactie #2 Gepost op: 22 maart 2010, 21:58:32 »
Dizzl,

Heb in bijlage een db gemaakt zodat mijn bedoeling wat duidelijker kan worden.
Bedoeling is dat producten geteld worden. Producten die geteld zijn krijgen een teldatum. Dit wordt opgeroepen in de procedure door de qryvoorraad. De vbaprocedure moet via een loop per record nagaan wat de teldatum is en die voor elk product in de queryvoorraad gebruiken om te tellen in de orders die plaatsvonden nà de teldatum. Daarom moet de variabele van de qryvoorraad (productId en teldatum) worden gebruikt in de strSQL query waar de teldatum gebruikt wordt om de orders na de teldatum te gebruiken in de berekening.
Dit moet dan record per record worden uitgevoerd en in de tblTelling komen de productId en de tekorten in Tekort.

Ben benieuwd.

Grt.

Standaard emailprogramma: Outlook Express
Standaard Operating System: Windows XP SP2
Standaard Browser:Internet Explorer 7

Offline dizzl

  • Ambassadeur
  • *****
  • Berichten: 2.346
  • I've Upped my standards,now,up yours!
Re: VBA en SQL
« Reactie #3 Gepost op: 23 maart 2010, 14:37:16 »
Als je query goed is zal het resultaat ook het verhoopte resultaat zijn.
Kijk eens na wil je en laat wat weten als het nog niet ok is.
Systeem  : Intel Core i5-4440 3.1Ghz, 3.1GHz 16Giga Ram 64Bits
Software : Windows 10 professional, Avira, Office 2016 Professional

Offline Maurann

  • Volledig lid
  • **
  • Berichten: 166
Re: VBA en SQL
« Reactie #4 Gepost op: 24 maart 2010, 20:48:42 »
Dizzl,

de code werkt, maar 't is niet wat ik wil.
In de procedure moet de qryvoorraad geopend worden want de procedure gebruikt daarvan de velden productId en teldatum.
De procedure loopt door de recordset van qryvoorraad en per record gebruikt hij de data productId en data teldatum die hij in de qryvoortelling plaatst (bedoeling is dat de orders nà de teldatum worden berekend). het resultaat wordt in tblTelling geplaatst.
Nadien gaat de loop naar het volgend record van qryvoorraad, slaat de productId en teldatum op in de variabele en gebruikt die opnieuw in de qryvoortelling ( waar de teldatum van qryvoorraad wordt gebruikt als orderdatum) en opnieuw wordt opgeslaan.
Tot eind van de recordset.

Dus procedure doet 't volgende:

Opent QryVoorraad
Telt records
Loop dr recordset:
begin bij 1ste recordset, slaat productId en teldatum op in variabele,
opent qryvoortelling waar qryvoortelling.productid = qryvoorraad.ProductId en Qryvoortelling.Orderdatum = Qryvoorraad.Teldatum .

slaat productId en Tekort op en plaatst dit in tblTelling.

Doorloopt zo verder recordset.

Het probleem dat ik ervaar is het doorgeven van de variabelen uit de qryvoorraad naar de qryvoortelling.


Hoop dat 't duidelijker is.

Grt.

M.


Standaard emailprogramma: Outlook Express
Standaard Operating System: Windows XP SP2
Standaard Browser:Internet Explorer 7

Offline Maurann

  • Volledig lid
  • **
  • Berichten: 166
Re: VBA en SQL
« Reactie #5 Gepost op: 26 maart 2010, 16:17:53 »
Ben 't verder aan 't uittesten.
Maar de code doet nog niet wat ik wil.

M.

Dim trsql As String
Dim strsql As String
Dim rs As ADODB.Recordset
Dim cnn As New ADODB.Connection
Dim Teller As Integer
Dim A As Integer
Dim spe As Long
Dim gro As Date
Dim tek As Long
Dim rst As New ADODB.Recordset

strsql = "DELETE tblTelling.* FROM tblTelling"
DoCmd.SetWarnings (False)
DoCmd.RunSQL strsql
DoCmd.SetWarnings (True)

MsgBox "tblTelling is leeg"

Set rs = New ADODB.Recordset
Set cnn = CurrentProject.Connection

rs.Open "QryVoorraad", cnn, adOpenStatic, adLockReadOnly, adCmdStoredProc
rs.MoveLast
Teller = rs.RecordCount

rs.MoveFirst
For A = 1 To Teller

    spe = rs.Fields("ProductId")
    gro = rs.Fields("Teldatum")
       
  trsql = "SELECT [Voorraad]+(Sum([orderdetail.mutaantalin]-[orderdetail.aantal]))-[Minvoorraad] AS Tekort, Orderdetail.ProductId, Sum(Orderdetail.MutAantalIn) AS SomVanMutAantalIn, Sum(Orderdetail.Aantal) AS Verkocht, Product.Voorraad, Product.Minvoorraad" _
& " FROM Product INNER JOIN (Orders INNER JOIN Orderdetail ON Orders.Orderid = Orderdetail.OrderId) ON Product.ProductId = Orderdetail.ProductId" _
& " WHERE (((Orders.Orderdatum) >= " & [gro] & ")) And Product.ProductId = " & spe & " " _
& " GROUP BY Orderdetail.ProductId, Product.Voorraad, Product.Minvoorraad" _
& " HAVING ((Product.Minvoorraad) <> 0)"
   
    rst.Open trsql, cnn, adOpenStatic, adLockReadOnly
       
    tek = rst.Fields("tekort")
       
       strsql = "INSERT INTO tblTelling ( ProductId, Tekort ) Values(" & spe & ", " & tek & "  )"
        DoCmd.SetWarnings (False)
    DoCmd.RunSQL strsql
    DoCmd.SetWarnings (True)
    rst.Close
Next A

MsgBox "Klaar tblTelling is gevuld"

cnn.Close
Set rs = Nothing
Set cnn = Nothing



   
 
Standaard emailprogramma: Outlook Express
Standaard Operating System: Windows XP SP2
Standaard Browser:Internet Explorer 7

Offline dizzl

  • Ambassadeur
  • *****
  • Berichten: 2.346
  • I've Upped my standards,now,up yours!
Re: VBA en SQL
« Reactie #6 Gepost op: 26 maart 2010, 18:28:21 »
Even een korte vraag.
Als je nu gewoon de tblProduct doorloopt en een record aanmaakt in een nieuwe tabel voor elk product waarvan de voorraad lager is dan de minimumvoorraad?

Ik snap de bedoeling van die teldatum eigenlijk  niet.
Systeem  : Intel Core i5-4440 3.1Ghz, 3.1GHz 16Giga Ram 64Bits
Software : Windows 10 professional, Avira, Office 2016 Professional

Offline Maurann

  • Volledig lid
  • **
  • Berichten: 166
Re: VBA en SQL
« Reactie #7 Gepost op: 26 maart 2010, 19:33:07 »
Dizzl,

terechte opmerking.

Maar de producten worden in de db ingevoegd op verschillende datums, worden verkocht en regelmatig opnieuw aangekocht en ingevoerd. Het totaal aantal producten in de db beloopt > 25000, en 't is onbegonnen werk die allemaal te tellen. Om momenteel zicht te krijgen op de voorraad is 't plan om systematisch op diverse dagen tellingen te ondernemen van de producten. Alle tegelijk gaat organisatorisch niet. Vandaar de teldatum. In qryvoorraad wordt die opgevraagd per product, en de qryvoortelling berekend afhankelijk van in- en verkoop (wat in de tabel orderdetails wordt bijgehouden), de aan te kopen producten vanaf teldatum.
(de qry laten berekenen vanaf een bepaalde orderdatum gaat niet omdat geteld wodt op diverse dagen )
Vandaar de procedure.

Vriendelijke groeten,

M.
Standaard emailprogramma: Outlook Express
Standaard Operating System: Windows XP SP2
Standaard Browser:Internet Explorer 7

Offline dizzl

  • Ambassadeur
  • *****
  • Berichten: 2.346
  • I've Upped my standards,now,up yours!
Re: VBA en SQL
« Reactie #8 Gepost op: 27 maart 2010, 08:54:02 »
Is wat ik zeg juist?

tekort =  Voorradig (geteld vanafaf laatste teldatum) - Minvooraad - Som van de aantal verkochte (vanaf de laatste teldatum)

MutatieAantal in de tabel Orderdetail snap ik ook niet maar ik stel vast dat in die tabel ook Aantal voorkomt met Negatie Waarden? Kan dat?

Heb wat geduld met me hé :-)


Systeem  : Intel Core i5-4440 3.1Ghz, 3.1GHz 16Giga Ram 64Bits
Software : Windows 10 professional, Avira, Office 2016 Professional

Offline Maurann

  • Volledig lid
  • **
  • Berichten: 166
Re: VBA en SQL
« Reactie #9 Gepost op: 27 maart 2010, 11:54:43 »
Dizzl,

wil vooral leren in vba access (vind het een fantastisch programma). En doe dit via dit forum en ben daarvoor dankbaar.

tekort is inderdaad de voorraad - minvoorraad +
(sum([orderdetail.mutaantalin]-[orderdetail.aantal]))
geteld vanaf orderdatum >= teldatum
( = teldatum van het geselecteerde productid (uit de qryvoorraad)

mutaantalin van tabel orderdetail betekent gewoon aantal producten die in voorraad komen (aangekocht worden). orderdetail.aantal = aantal verkochte producten

negatieve waarden kunnen niet in praktijk, maar is enkel om 't uit te proberen.


grt

M.
Standaard emailprogramma: Outlook Express
Standaard Operating System: Windows XP SP2
Standaard Browser:Internet Explorer 7

Offline dizzl

  • Ambassadeur
  • *****
  • Berichten: 2.346
  • I've Upped my standards,now,up yours!
Re: VBA en SQL
« Reactie #10 Gepost op: 27 maart 2010, 16:53:54 »
Kijk eens of je hier wat aan hebt?
Hoe je aan die aantallen komt is me nog niet duidelijk maar  je zal wel snappen wat ik bedoel.
Systeem  : Intel Core i5-4440 3.1Ghz, 3.1GHz 16Giga Ram 64Bits
Software : Windows 10 professional, Avira, Office 2016 Professional

Offline Maurann

  • Volledig lid
  • **
  • Berichten: 166
Re: VBA en SQL
« Reactie #11 Gepost op: 28 maart 2010, 11:32:18 »
Dit is de weg.
Echter moet de code nog 1 ding doen,
de productId erook uithalen .

 vAantal = DSum("Aantal", "qryAlleOrders", "OrderDatum >=#" & rsTeldatum & "#" )
  vMutAantalIn = DSum("MutAantalIn", "qryAlleOrders", "OrderDatum >=#" & rsTeldatum & "#" )
 
Want enkel de teldatum heeft hij een verkeerde som.
Vulde aan met productId :
 vAantal = DSum("Aantal", "qryAlleOrders", "OrderDatum >=#" & rsTeldatum & "#" And "ProductId =  " & rsProductID & "")
  vMutAantalIn = DSum("MutAantalIn", "qryAlleOrders", "OrderDatum >=#" & rsTeldatum & "#" And "ProductId = " & rsProductID & "")
 
Er komt echter een foutboodschap van visual basic:
typen komen niet met elkaar overeen.

Is de syntaxis wel ok?

Bedankt.

M.
Standaard emailprogramma: Outlook Express
Standaard Operating System: Windows XP SP2
Standaard Browser:Internet Explorer 7

Offline dizzl

  • Ambassadeur
  • *****
  • Berichten: 2.346
  • I've Upped my standards,now,up yours!
Re: VBA en SQL
« Reactie #12 Gepost op: 28 maart 2010, 12:05:13 »
vMutAantalIn = DSum("MutAantalIn", "qryAlleOrders", "OrderDatum >=#" & rsTeldatum & "# And ProductId = " & rsProductID)
Systeem  : Intel Core i5-4440 3.1Ghz, 3.1GHz 16Giga Ram 64Bits
Software : Windows 10 professional, Avira, Office 2016 Professional

Offline Maurann

  • Volledig lid
  • **
  • Berichten: 166
Re: VBA en SQL
« Reactie #13 Gepost op: 28 maart 2010, 12:33:28 »
TXS!  ;)
Standaard emailprogramma: Outlook Express
Standaard Operating System: Windows XP SP2
Standaard Browser:Internet Explorer 7

 


www.combell.com