Springen naar inhoud


- - - - -
DB .NET

Loop Probleem In Ado

.NET

  • Log in a.u.b. om te beantwoorden
Er zijn 5 reacties in dit onderwerp

#1 Marc Devlieger

Marc Devlieger

    Starting Developer

  • Leden
  • 13 berichten
    Laatst bezocht 05 mei 2015 17:51

Geplaatst op 08 februari 2015 - 20:20

Hallo, ik wens een progje om excelsheets te importeren in een listbox. Ik krijg enkel de eerste kolom te zien.

Wat gebeurt er tijdens het starten :

Ik heb een database met velden... deze velden vergelijkt het met de fields.name van het excelbestand. Komen de velden  met fields.name excelbestand overeen toont het de gegevens van XLS in een listbox. Dat gebeurt.. maar enkel de eerste kolom van het excelbestand. Ik moet dus ergens een Loop en plaatsen met het aantal gegevens (rijen) in excelbestand.... maar waar ???


.....
For TellerA = 0 To Form_03.CMBMap.ListCount - 1

For TellerB = 0 To Form_00.LSTMap.ListCount - 1

ZA = Len(Form_00.LSTMap.List(TellerB))
If Left(Form_03.CMBMap.List(TellerA), ZA) = Form_00.LSTMap.List(TellerB) Then

strQuery = Query_001 & " Postprocessing WHERE Operator='" & TekstA & "' AND Map='" & Form_00.LSTMap.List(TellerB) & "'"
Module_05.Uitvoer_CommObsCompare_database

RsADO_CommObsCompare.MoveFirst

strQuery = Query_001 & " [" & Form_03.CMBMap.List(TellerA) & "$]"
Module_07.Uitvoer_Excelbestand

RsADO_Excel.MoveFirst

'X = RsADO_Excel.Fields.Count
'Y = RsADO_Excel.RecordCount

For TellerC = 0 To RsADO_CommObsCompare.RecordCount - 1

For TellerD = 0 To RsADO_Excel.Fields.Count - 1

If RsADO_Excel.Fields(TellerD).Name = RsADO_CommObsCompare!Post_item Then

If Not IsNull(RsADO_Excel.Fields(TellerD).Value) And RsADO_Excel.Fields(TellerD).Value <> "" Then

Form_00.LSTTEST.AddItem RsADO_Excel.Fields(TellerD).Value

Else

Form_00.LSTTEST.AddItem "-"

End If

End If

Next TellerD

RsADO_CommObsCompare.MoveNext
Next TellerC

RsADO_Excel.Close
RsADO_CommObsCompare.Close

End If

Next TellerB

Next TellerA
.....

#2 Dirk Andries

Dirk Andries

    Guru Developer

  • Leden
  • PipPipPipPipPipPip
  • 1145 berichten
    Laatst bezocht
  • LocatieGent

Geplaatst op 08 februari 2015 - 21:41

Bericht bekijkenMarc Devlieger, op 08 februari 2015 - 20:20, zei:

Hallo, ik wens een progje om excelsheets te importeren in een listbox. Ik krijg enkel de eerste kolom te zien.
Ok.

Bericht bekijkenMarc Devlieger, op 08 februari 2015 - 20:20, zei:

Code:
Form_00.LSTTEST.AddItem "-"

Dat is geen vb.net?
Is het mogelijk dat je je vraag in het foute forum hebt gesteld?

#3 Marc Devlieger

Marc Devlieger

    Starting Developer

  • Leden
  • 13 berichten
    Laatst bezocht 05 mei 2015 17:51

Geplaatst op 08 februari 2015 - 22:23

verdorie... yeps.. ikke nog een oldtimer met VB6

#4 Marc Devlieger

Marc Devlieger

    Starting Developer

  • Leden
  • 13 berichten
    Laatst bezocht 05 mei 2015 17:51

Geplaatst op 08 februari 2015 - 22:28

maar toch een beetje juist in de forum database development ;-)

#5 Dirk Andries

Dirk Andries

    Guru Developer

  • Leden
  • PipPipPipPipPipPip
  • 1145 berichten
    Laatst bezocht
  • LocatieGent

Geplaatst op 09 februari 2015 - 12:59

Bericht bekijkenMarc Devlieger, op 08 februari 2015 - 20:20, zei:

Ik heb een database met velden... deze velden vergelijkt het met de fields.name van het excelbestand.
Komen de velden  met fields.name excelbestand overeen toont het de gegevens van XLS in een listbox.
Dat gebeurt.. maar enkel de eerste kolom van het excelbestand.
Ik moet dus ergens een Loop en plaatsen met het aantal gegevens (rijen) in excelbestand.... maar waar ???

In vb.net dan maar (ik spreek geen vb classic)

Je moet kiezen welke loop er binnen de andere wordt uitgevoerd.
Ofwel:
1) Wat je nu hebt, maar dan met extra loop.
Dat geeft je de resultaten per kolom.
Dus eerst alle resultaten uit b.v. kolom A: rij1, rij2, rij3, ..., en dan kolom B: rij1, rij2, ....
Visual Basic Code:
			recordSetNames.MoveFirst()
			While Not recordSetNames.EOF
				Dim fieldName = recordSetNames.Fields("Post_Item").Value.ToString.ToLower()
					For Each field As ADODB.Field In recordSetExcel.Fields
					If field.Name.ToLower = fieldName Then
						recordSetExcel.MoveFirst()
						While Not recordSetExcel.EOF
							Display(recordSetExcel.Fields(field.Name).Value)
							recordSetExcel.MoveNext()
						End While
					End If
					Next
				recordSetNames.MoveNext()
			End While


2) Ofwel met de inner en outer loop omgekeerd.
Dat geeft je het resultaat per rij.
Dus kolom A, kolom B, kolom ... van rij 1, dan kolom A, kolom B, kolom ...van rij  2, ...
Visual Basic Code:
			recordSetExcel.MoveFirst()
			While Not recordSetExcel.EOF
				recordSetNames.MoveFirst()
				While Not recordSetNames.EOF
					Dim fieldName = recordSetNames.Fields("Post_Item").Value.ToString.ToLower()
					For Each field As ADODB.Field In recordSetExcel.Fields
						If field.Name.ToLower = fieldName Then
							Display(recordSetExcel.Fields(field.Name).Value)
						End If
					Next
					recordSetNames.MoveNext()
				End While
				recordSetExcel.MoveNext()
			End While


Voor 2 is het nogal onzinnig om telkens opnieuw over de recordset te itereren.
Je kan het beter in twee splitsen en de veldnamen 1 keer opvragen en in een array stoppen.
De variabele result bevat dan alle veldnamen uit de query van veldnamen
Visual Basic Code:
			recordSetNames.Open(queryNames, connectionNames)
			recordSetNames.MoveFirst()
			While Not recordSetNames.EOF
				Dim value = TryCast(recordSetNames.Fields("Post_Item").Value, String)
				If Not String.IsNullOrEmpty(value) Then
					result.Add(value.ToLower())
				End If
				recordSetNames.MoveNext()
			End While


Die kan je dan gebruiken (hier met de naam fieldNames) in de query over het Excel bestand:
Visual Basic Code:
		   recordSetExcel.MoveFirst()
			While Not recordSetExcel.EOF
				For Each field As ADODB.Field In recordSetExcel.Fields
					If fieldNames.Contains(field.Name.ToLower()) Then
						Display(recordSetExcel.Fields(field.Name).Value)
					End If
				Next
				recordSetExcel.MoveNext()
			End While


Indien je zeker bent dat de kolomnamen moeten voorkomen, kan je zelfs de excel query zodanig aanpassen, dat je check op de velden overbodig wordt:
je selecteert ENKEL die kolommen die voorkomen in het resultaat van de query voor de veldnamen:

Bouwen van de SELECT:
Visual Basic Code:
   Dim queryExcel As String = "SELECT " + String.Join(",", fieldNames) + " FROM [Blad1$]"

en de verwerking:Visual Basic Code:
			recordSetExcel.MoveFirst()
			While Not recordSetExcel.EOF
				For Each field As ADODB.Field In recordSetExcel.Fields
					Display(recordSetExcel.Fields(field.Name).Value)
				Next
				result.Add(New String("-"c, 80))
				recordSetExcel.MoveNext()
			End While



#6 Dirk Andries

Dirk Andries

    Guru Developer

  • Leden
  • PipPipPipPipPipPip
  • 1145 berichten
    Laatst bezocht
  • LocatieGent

Geplaatst op 09 februari 2015 - 13:15

Met volgende spreadsheet
Bijlage  adoexcel.png   44,73K   7 downloads

geeft dat met respectievelijk methode 1 en methode 2 met custom gebouwde select:
Bijlage  adooutput.png   44,05K   8 downloads

De select:
Bijlage  adoselect.png   25,87K   6 downloads





Ook met taq DB .NET, .NET voorzien

0 gebruiker(s) lezen dit onderwerp

0 lid(leden), 0 bezoeker(s), 0 anonieme gebruikers

Inloggen


[DB .NET] Untitled 1

Met dank aan J├╝rgen voor de jarenlange inzet van visualbasic.be (anno dec 2000)
Met dank aan Mike en Ronneke voor de jarenlange inzet van vbib.be (anno dec 2010)
Met dank aan PascalBianca voor de jarenlange inzet van vbib.be (anno dec 2016)