Help!

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

Hulp bij posten

Recente topics

Auteur Topic: Herstellen excel bestand  (gelezen 41562 keer)

0 leden en 1 gast bekijken dit topic.

Offline Georgyboy

  • Ervaren lid
  • ***
  • Berichten: 314
  • Geslacht: Man
  • Oplossing.be
Re: Herstellen excel bestand
« Reactie #60 Gepost op: 19 september 2019, 17:50:32 »
Hey Putifo

Deze code  werkt fantastisch met gegevens uit 1 tabel
opdracht = "select Artikel, Lokatie, Chargenummer, Datum, MutatieSt, soort from " & DDDDDDD & "DDDDDDD.vrd "

Deze test lukt me niet om uit 2 tabellen gegevens te halen in standaard tabel staat het art N° en in de andere de artikelnaam
'opdracht = "select Artikel, Lokatie, Chargenummer, Datum, MutatieSt, soort , [color=red]Plu2.NaamRek[/color], from " & "DDDDDDD.vrd "
Hier zou waarschijnlijk ook de From "DDDDDDD.plu2" moeten bijkomen maar lukt met niet, loopt vast op Refrech……….

Bij test in de ERP en een verbinding lukt het wel, enkel zou fijn zijn dat het ook via de vba code kan

In bijlage verbinding en SQL code uit de ERP

Verder probeer ik je nuttige tips verder uit :)

Groetjes
Georgyboy

Offline Georgyboy

  • Ervaren lid
  • ***
  • Berichten: 314
  • Geslacht: Man
  • Oplossing.be
Re: Herstellen excel bestand
« Reactie #61 Gepost op: 19 september 2019, 18:29:23 »
Weer stapje verder :)

PS code "Chargenummer = 16036" = om de code te testen kan ook een andere N° of zoekveld zijn
Lukt met volgende regel doch er is geen correcte relatie tussen Artikel & NaamRek (uit de 2 tabellen)

NaamRek komt erin maar Fout artikel
Uit de SQL code van de ERP database
select Artikel, Lokatie, Chargenummer, Datum, MutatieSt, soort, NaamRek from DDDDDDDD.vrd, DDDDDDDD.plu2 where Chargenummer = 16036


Met aanpassing in de SQL code van ERP (uit ERP)
SELECT Vrd.Artikel, Vrd.Lokatie, Vrd.ChargeNummer, Vrd.Datum, Vrd.MutatieSt, Vrd.Soort, Plu2.NaamRek
FROM DDDDDDDD.Plu2 Plu2, DDDDDDDD.Vrd Vrd
WHERE Plu2.PluNum = Vrd.Artikel AND ((Vrd.ChargeNummer=16036))

Denk dat dit ergens in de VBA code moet komen voor de relatie ?
WHERE [color=red]Plu2.PluNum = Vrd.Artikel[/color] AND ((Vrd.ChargeNummer=16036))
We proberen verder............


Offline pitufo

  • Ambassadeur
  • *****
  • Berichten: 1.343
  • Geslacht: Man
Re: Herstellen excel bestand
« Reactie #62 Gepost op: 20 september 2019, 08:47:31 »
Ja maar Georgyboy, wil jij eigenlijk wel (nog) geholpen worden?
Kijk, ik wil hier gerust nog tot volgend voorjaar mee doorgaan, maar niet als je blijft tegenwerken. Ik steek hier zeker en vast veel minder tijd in dan je wellicht denkt, maar zó waardeloos vind ik mijn tijd echt niet om hier blijvend raad te geven die je naast je neerlegt.
Sorry dat ik het eens een beetje cru moet zeggen, het is omdat het anders precies niet doordringt. En je moet mijn adviezen echt niet volgen om mij een plezier te doen, maar om jezelf een plezier te doen!
OK, ik leg concreet uit wat ik bedoel: in reactie #58 vraag je om bovenop wat we al hebben een methode om gegevens uit een 2° tabel te koppelen. In reactie #59 geef ik jou daarvoor de exacte code, inclusief de nodige uitleg. En dan... kom jij in reacties #60 en #61 met allerlei zogenaamde probeersels waarvan er één eventueel zou kunnen werken (kan ik niet weten zonder de volledige opbouw van je database te kennen). Heb ik mijn ganse reactie #59 dan voor piet snot geschreven?

Ik stel voor dat je mijn vorige uitleg nog eens naleest en dat gewoon probeert. Als het niet werkt, post hier dan eens je volledige code, of nog beter het Excel-bestand waar je nu in werkt (de serverparameters, en niets anders, mag je daar gerust weglaten of wijzigen, die kan ik toch niet testen).
En als het wel werkt (waar ik zo goed als zeker van ben) toon ik je daarna een extraatje dat "a small step" zal zijn in de code maar "one giant step" in het resultaat.
"De computer doet wel degelijk wat je hem vraagt,
 maar NIET wat je DENKT dat je hem vraagt"

Offline Georgyboy

  • Ervaren lid
  • ***
  • Berichten: 314
  • Geslacht: Man
  • Oplossing.be
Re: Herstellen excel bestand
« Reactie #63 Gepost op: 20 september 2019, 15:56:30 »
Dag Putifo,
Sorry dat ik zo´n lastpost ben, je geeft me tal van tips en neem deze letterlijk en probeer ze altijd uit.
Ben ervan aangedaan  :-[ en weet soms niet beter
Ik apprecieer enorm wat je voor mij doet, inzicht ontbreekt me nog omdat ik alles letterlijk overneem.

Bedankt desondanks dat je nog verder wil doen, het werkte al perfect en wil soms meer dan we kunnen.

Info over huidige test:
Gegevens uit 1 tabel lukt perfect met de 3 filters of de volledige data.
Met je code letterlijk over te nemen liep ik vast, zo kon ik wel zien wat de SQL code was (via Excel)

#59 heb je zeker niet voor niets geschreven, heb het meermaals gelezen en letterlijk geprobeerd, maar weet soms niet beter.

Met de code uit te voeren loopt er een stukje vast, dit kan men zien in de SQL code, vermoedelijk te veel gegevens.

Sub db_selectie()

Dim naam(1 To 3)
Dim zoek(1 To 3)

With Sheets("keuzes")
    For i = 1 To 3
        naam(i) = .Cells(i, 1)
        zoek(i) = .Cells(i, 2)
    Next i
    uitvoer = .Cells(5, 2)
End With

Select Case uitvoer
    Case "blad 'resultaat' (bestaande gegevens overschrijven)"
        Sheets("resultaat").Select
        Cells.ClearContents
    Case "nieuw werkblad"
        Sheets.Add after:=Sheets(Sheets.Count)
    Case "nieuwe werkmap"
        Workbooks.Add
End Select
opdracht = "SELECT Vrd.Artikel, Vrd.Lokatie, Vrd.ChargeNummer, Vrd.Datum, Vrd.MutatieSt, Vrd.Soort, Plu2.NaamRek FROM Plu2, Vrd WHERE =16036"


volgende = False
For i = 1 To 3
    If zoek(i) <> "" Then
        If volgende = False Then
            opdracht = opdracht & naam(i) & " = " & zoek(i) & " "
            volgende = True
        Else
            opdracht = opdracht & "and " & naam(i) & " = " & zoek(i) & " "
        End If
    End If
Next i


With ActiveSheet.ListObjects.Add(SourceType:=0, Source:=…………………….
 Destination:=Range("$A$1")).QueryTable
    .CommandText = opdracht
    .Refresh BackgroundQuery:=False
End With


End Sub

Jouw code
opdracht = "SELECT Vrd.Artikel, Vrd.Lokatie, Vrd.ChargeNummer, Vrd.Datum, Vrd.MutatieSt, Vrd.Soort, Plu2.NaamRek FROM Plu2, Vrd WHERE Plu2.PluNum = Vrd.Artikel AND Vrd.ChargeNummer=16036"
Dit komt in de SQL code
SELECT Vrd.Artikel, Vrd.Lokatie, Vrd.ChargeNummer, Vrd.Datum, Vrd.MutatieSt, Vrd.Soort, Plu2.NaamRek FROM Plu2, Vrd WHERE [color=red]=16036Chargenummer = 16036 [/color]
Deze werkt op 2 tabellen met een selectie uit 1 of tot 3 keuzes, niet op de gehele lijst
opdracht = "SELECT Vrd.Artikel, Vrd.Lokatie, Vrd.ChargeNummer, Vrd.Datum, Vrd.MutatieSt, Vrd.Soort, Plu2.NaamRek FROM Plu2, Vrd WHERE Plu2.PluNum = Vrd.Artikel AND " 'werkt op selectie

volgende = False
For i = 1 To 3
    If zoek(i) <> "" Then
        If volgende = False Then
            opdracht = opdracht & naam(i) & " = " & zoek(i) & " "
            volgende = True
        Else
            opdracht = opdracht & "and " & naam(i) & " = " & zoek(i) & " "
        End If
    End If
Next i



Resultaat SQL code (uit de 2 tabellen)
SELECT Vrd.Artikel, Vrd.Lokatie, Vrd.ChargeNummer, Vrd.Datum, Vrd.MutatieSt, Vrd.Soort, Plu2.NaamRek FROM Plu2, Vrd WHERE Plu2.PluNum = Vrd.Artikel AND Chargenummer = 16030

Nogmaals sorry en dank

Offline pitufo

  • Ambassadeur
  • *****
  • Berichten: 1.343
  • Geslacht: Man
Re: Herstellen excel bestand
« Reactie #64 Gepost op: 20 september 2019, 18:39:25 »
OK, we zijn terug vertrokken...

Ik geloof je echt wel als je zegt dat je alles letterlijk overneemt, maar dat is slechts een mening: je neemt niet alles letterlijk over.
Mijn eerdere code uit de fameuze post 59
opdracht = "SELECT Vrd.Artikel, Vrd.Lokatie, Vrd.ChargeNummer, Vrd.Datum, Vrd.MutatieSt, Vrd.Soort, Plu2.NaamRek FROM Plu2, Vrd WHERE Plu2.PluNum = Vrd.Artikel AND Vrd.ChargeNummer=16036"moet werken, maar natuurlijk NIET in combinatie met de lus "For i = 1 To 3 ... Next i" die we voor een ander doeleinde hadden ingebouwd.
In je nu meegestuurde code gebruik je beide methodes door elkaar waardoor je een CommandText creëert die kant noch wal raakt.

Nog even recapituleren:
Eerst en vooral: als je iets krijgt als "ExterneGegevens_1: Gegevens ophalen ..." is de connectie zeker en vast goed, maar zo ver kom je nu al altijd, meen ik toch?
Als je die melding krijgt gevolgd door een foutmelding, dan is je CommandText verkeerd. Eigenlijk moet je daar dus verder niet van wakker liggen, die foutmelding zal dan altijd komen opdagen bij de Refresh-instructie.

We concentreren ons dus nog enkel en alleen op de CommandText. Ofwel schrijf je die, ofwel bouwen we die binnen vba op gebaseerd op je filters.

Voorbeeldje voor methode 1 (voor de eenvoud houden we hier geen rekening met blad "keuzes" en zetten de uitvoer op blad "resultaat"):
Sub db_selectie()
       
Sheets("resultaat").Select
Cells.ClearContents
opdracht = "SELECT Vrd.Artikel, Vrd.Lokatie, Vrd.ChargeNummer, Vrd.Datum, Vrd.MutatieSt, Vrd.Soort, Plu2.NaamRek FROM Plu2, Vrd WHERE Plu2.PluNum = Vrd.Artikel AND Vrd.ChargeNummer=16036"
With ActiveSheet.ListObjects.Add...QueryTable   'deze lijn wel aanpassen voor je ERP-database
    .CommandText = opdracht
    .Refresh BackgroundQuery:=False
End With

End Sub

En voorbeeldje voor methode 2 (enkel uit één tabel):
Sub db_selectie()

Dim naam(1 To 3)
Dim zoek(1 To 3)
With Sheets("keuzes")
    For i = 1 To 3
        naam(i) = .Cells(i, 1)
        zoek(i) = .Cells(i, 2)
    Next i
    uitvoer = .Cells(5, 2)
End With
Select Case uitvoer
    Case "blad 'resultaat' (bestaande gegevens overschrijven)"
        Sheets("resultaat").Select
        Cells.ClearContents
    Case "nieuw werkblad"
        Sheets.Add after:=Sheets(Sheets.Count)
    Case "nieuwe werkmap"
        Workbooks.Add
End Select
opdracht = "select * from vrd "
volgende = False
For i = 1 To 3
    If zoek(i) <> "" Then
        If volgende = False Then
            opdracht = opdracht & "where " & naam(i) & " = " & zoek(i) & " "
            volgende = True
        Else
            opdracht = opdracht & "and " & naam(i) & " = " & zoek(i) & " "
        End If
    End If
Next i
With ActiveSheet.ListObjects.Add...QueryTable   'deze lijn wel aanpassen voor je ERP-database
    .CommandText = opdracht
    .Refresh BackgroundQuery:=False
End With

End Sub

Zoals gezegd, OF de ene code, OF de andere, maar niet gaan mengen!
En om zeker niet te kunnen missen heb ik voor beide methodes de volledige code hier gezet. Ik denk dat het echt noodzakelijk is dat je dit 100% begrijpt vooraleer we verder kunnen.

En toch waag ik het maar. Met deze moet het dus lukken om in methode 2 een koppeling met een 2° tabel te realiseren (die heb ik hier zomaar uit de losse pols geschreven zonder te kunnen testen, dus even afwachten, al denk ik niet dat ik ergens over kijk):
Sub db_selectie()

Dim naam(1 To 3)
Dim zoek(1 To 3)
With Sheets("keuzes")
    For i = 1 To 3
        naam(i) = .Cells(i, 1)
        zoek(i) = .Cells(i, 2)
    Next i
    uitvoer = .Cells(5, 2)
End With
Select Case uitvoer
    Case "blad 'resultaat' (bestaande gegevens overschrijven)"
        Sheets("resultaat").Select
        Cells.ClearContents
    Case "nieuw werkblad"
        Sheets.Add after:=Sheets(Sheets.Count)
    Case "nieuwe werkmap"
        Workbooks.Add
End Select
opdracht = "select Vrd.Artikel, Vrd.Lokatie, Vrd.ChargeNummer, Vrd.Datum, Vrd.MutatieSt, Vrd.Soort, Plu2.NaamRek FROM Plu2, Vrd where Plu2.PluNum = Vrd.Artikel "
For i = 1 To 3
    If zoek(i) <> "" Then
        opdracht = opdracht & "and vrd." & naam(i) & " = " & zoek(i) & " "
    End If
Next i
With ActiveSheet.ListObjects.Add...QueryTable   'ook hier aanpassen voor je ERP-database
    .CommandText = opdracht
    .Refresh BackgroundQuery:=False
End With

End Sub

Laat ons duidelijk afspreken: doe de eerste methode nog eens. Probeer die helemaal te begrijpen als ze lukt.
Doe vervolgens hetzelfde met de tweede methode.
Als ook die helemaal duidelijk is mag je gerust de laatste code ook proberen!

Ik zal waarschijnlijk tot zondagavond afwezig zijn, maar vroeg of laat kijk ik er dan wel weer naar.

Ach ja, nog even dit:
Citaat
vermoedelijk te veel gegevens
Daar zal het heus niet aan liggen, als sql meer records vindt dan je beschikbare rijen in je Excel-versie hebt zal hij zelfs alle rijen vullen (de rest ben je dan wel kwijt). Maar vermits je praatte over een paar honderdduizend records en we er hier massa's wegfilteren zullen we daar geen last van hebben.

Nog een laatste afspraak? Als er iets mislukt, stuur je dan de volledige code mee?

Groeten,
pitufo
"De computer doet wel degelijk wat je hem vraagt,
 maar NIET wat je DENKT dat je hem vraagt"

Offline Georgyboy

  • Ervaren lid
  • ***
  • Berichten: 314
  • Geslacht: Man
  • Oplossing.be
Re: Herstellen excel bestand
« Reactie #65 Gepost op: 21 september 2019, 11:19:17 »
Hey Putifo,

Heb nu eindelijk gedaan wat je vroeg en het lukt een voor een.

De 3 methodes die je gaf lopen alle als een sneltrein, als een flits zijn de gegevens beschikbaar.

Weet niet hoe ik me kan verontschuldigen, maar begreep het niet en heb er een zootje van gemaakt.

Ooit heeft een leraar we de regel van 3 geleerd, die ik destijds niet begreep, dank zij hem ben ik dit nooit meer vergeten,
Hij heeft dit op een manier uitgelegd hoe ik dit kon begrijpen voor altijd.

Zo heb je voor mij in deze materie zoveel gedaan voor me, wat nooit iemand heeft gedaan  :'(
Ben gelijktijdig blij maar ook verdrietig naar wat ik je heb aangedaan, maar wist niet beter

Bedankt dat je me zoveel leert

Groetjes Georgyboy

Offline pitufo

  • Ambassadeur
  • *****
  • Berichten: 1.343
  • Geslacht: Man
Re: Herstellen excel bestand
« Reactie #66 Gepost op: 26 september 2019, 13:23:51 »
Hallo Georgyboy,

Citaat
Ben gelijktijdig blij maar ook verdrietig naar wat ik je heb aangedaan
Er zijn al genoeg erge dingen in de wereld waar een mens verdrietig van wordt. Hiervoor is het echt niet nodig, hoor!

Fijn te horen dat je er nu mee weg bent!!
Citaat
De 3 methodes die je gaf lopen alle als een sneltrein, als een flits zijn de gegevens beschikbaar.
Plezant, hé? En precies zoals ik je al in mijn allereerste reactie voorspeld had.

Nog eventjes terug naar een warmmaakideetje van mij van even terug:
Citaat
En als het wel werkt (waar ik zo goed als zeker van ben) toon ik je daarna een extraatje dat "a small step" zal zijn in de code maar "one giant step" in het resultaat.
Ik had namelijk nog deze werkwijze van jou gezien n.a.v. een geslaagde test:
Citaat
Draaitabel uit de tabel ( waar I (in) = aantal in voorraad en waar U (Uit) aantal verkocht rest = huidige voorraad
Som van MutatieSt   Kolomlabels         
Rijlabels   I   U   (leeg)   Eindtotaal
(leeg)            
16034   45   -29      16
Eindtotaal   45   -29      16

Nadat je de gegevens hebt geïmporteerd ga je dus met een draaitabel de voorraad berekenen.
Laat mij duidelijk zijn: ik heb niets tegen draaitabellen, integendeel, ze zijn een prachtig instrument met formidabele mogelijkheden.
Maar: het kan beter (t.t.z. toch in onze nieuwe werkwijze).
Ik vind het niet meer dan normaal dat je zelf niet in deze richting denkt, want we gaan nu weer iets helemaal anders doen. Tot nu hebben we namelijk altijd weer individuele records uit je tabellen gehaald.
Maar we kunnen die binnen onze sql-code ook meteen gaan 'optellen'.

De 2° code uit mijn vorige post moet daartoe slechts minimaal worden aangepast.
Sub db_selectie()

Dim naam(1 To 3)
Dim zoek(1 To 3)
With Sheets("keuzes")
    For i = 1 To 3
        naam(i) = .Cells(i, 1)
        zoek(i) = .Cells(i, 2)
    Next i
    uitvoer = .Cells(5, 2)
End With
Select Case uitvoer
    Case "blad 'resultaat' (bestaande gegevens overschrijven)"
        Sheets("resultaat").Select
        Cells.ClearContents
    Case "nieuw werkblad"
        Sheets.Add after:=Sheets(Sheets.Count)
    Case "nieuwe werkmap"
        Workbooks.Add
End Select
opdracht = "select artikel, chargenummer, sum(mutatiest) as voorraad from vrd "   'enkel deze regel is gewijzigd!
volgende = False
For i = 1 To 3
    If zoek(i) <> "" Then
        If volgende = False Then
            opdracht = opdracht & "where " & naam(i) & " = " & zoek(i) & " "
            volgende = True
        Else
            opdracht = opdracht & "and " & naam(i) & " = " & zoek(i) & " "
        End If
    End If
Next i
opdracht = opdracht & "group by artikel, chargenummer"  'én deze regel is nog toegevoegd
With ActiveSheet.ListObjects.Add...QueryTable   'deze lijn wel aanpassen voor je ERP-database
    .CommandText = opdracht
    .Refresh BackgroundQuery:=False
End With

End Sub

Bekijk eens wat dat geeft...

Groeten,
pitufo

Update : Oeps, toch nog wel een regel vergeten, zeker... Code hierboven ondertussen aangepast.
"De computer doet wel degelijk wat je hem vraagt,
 maar NIET wat je DENKT dat je hem vraagt"

 


www.combell.com