2009-05-26 3 views
0

J'ai deux jeux d'enregistrements qui ont la même clé primaire: combinaison de deux colonnes appelées 'item_no' et 'Order_id' ..... Les deux jeux d'enregistrements ont cette clé primaire (combinaison) et reposent d'autres différentes colonnes ...aligner les lignes correspondantes dans un ensemble d'enregistrements

maintenant, je veux commander les (ces) rangées dans deux enregistrements de telle sorte que la position des dossiers (avec les mêmes valeurs de clé primaire) doit être identique ...

par exemple, envisager rset1 et rset2 ... ayant les colonnes ci-dessus comme combinaison de clé primaire et row5 dans rset1 a des valeurs pour 'item_no' et 'order_id' comme et la ligne 8 dans rset2 a des valeurs pour a Bove comme (qui est la même) ....

1) Maintenant, je veux apporter row5 (en rset1) à la position 8 sucht que les deux dossiers sont même en position dans les recordsets

2) si aucun enregistrement commun trouvé dans les deux rsets ... alors je le laisserai blnk à la position (dans rset1) pour la ligne correspondante (dans rset2) [signifiant que pour un enregistrement dans rset2 ther est aucun enregistrement correspondant existant dans rset1 ]

Il a toujours fait tht sûr pas: d'enregistrements dans rset2> THT dans rset1 ...

Pouvez-vous aider comment aller avec l'alignement des enregistrements dans le jeu d'enregistrements dans VB6.0 comme je serais lier ces jeux d'enregistrements à Excel pour afficher côte à côte ??

Toute méthode construite (pour faire l'alignement ou n'importe quoi) dans VB6.0 ??

+0

Les résultats sont-ils issus du même produit SQL? (Lequel?) Est-il possible de créer un FULL OUTER JOIN entre les deux resultsets en utilisant SQL? – onedaywhen

+0

ou l'union d'une jointure gauche et d'une jointure extérieure droite? – barrowc

Répondre

1

Il n'y a pas de méthode inbuild dans VB6 pour faire cela (pas que je sache), cependant, il est assez facile de faire soi-même. Ce que vous devez faire est de créer deux fausses listes d'enregistrements, une fois que vous les avez, vous pouvez les cracher comme vous le souhaitez (dans un fichier csv, Excel, accéder ms). CAVEAT: Les recordsSets doivent être triés par la clé primaire pour fonctionner. Ce code parcourt les deux jeux d'enregistrements dans l'ordre, créant des listes ordonnées avec des espaces ou des liens vers un enregistrement (alors qu'il ressemble beaucoup au code VB, considérez ceci comme du pseudo code, la logique est correcte, il ne compilera pas)

Dim rs1 As Recordset 
Dim rs2 As Recordset 

Dim rs1List As Collection 
Dim rs2List As Collection 

REM code here to initialise the collections to new Collection and fill the record sets 

Do While Not rs1.EOF And Not rs2.EOF 
    If rs1("PKey") = rs2("PKey") Then 
     rs1List.Add rs1.Bookmark 
     rs2List.Add rs2.Bookmark 
     rs1.Movenext 
     rs2.Movenext 
    ElseIf rs1("PKey") < rs2("PKey") Then 
     rs1List.Add rs1.Bookmark 
     rs2List.Add Nothing 
     rs1.Movenext 
    ElseIf rs1("PKey") > rs2("PKey") Then 
     rs1List.Add Nothing 
     rs2List.Add rs2.Bookmark 
     rs2.Movenext 
    End If 
Loop 
Do While Not rs2.EOF 
    rs1List.Add Nothing 
    rs2List.Add rs2.Bookmark 
    rs2.Movenext 
Loop 
Do While Not rs1.EOF 
    rs1List.Add rs1.Bookmark 
    rs2List.Add Nothing 
    rs1.Movenext 
Loop 

Suppose le champ de clé primaire est PKey, et que .Bookmark est une méthode que vous pouvez utiliser pour accéder directement à cet enregistrement (position ordinale peut faire le cas échéant).

Hope this helps

Modifier

ont juste changé quelques bits dans les deux dernières boucles, ils ne sont pas tout à fait raison.

+1

+1 ressemble à l'algorithme de fusion classique pour moi :) http://en.wikipedia.org/wiki/Merge_algorithm – MarkJ

+0

Ce serait ça, je l'ai utilisé au collège une vingtaine d'années, et avait complètement oublié son nom (en fait, j'avais oublié qu'il avait même un nom). –

+0

Point trivial: "Do While Not EOF" est souvent plus lisible que "Do Until EOF"." – Bob

Questions connexes