Bonjour,
Mon problème et le suivant :
Je veux remplir une 1ère table sql server en utilisant des données présentes dans une 2e table sql server et une 3e as400.
Pour cela j'utilise 3 DataTables, un par table, le 3e (DT) me sert à récupérer des deux premiers les lignes que je veux insérer dans ma 1ère table.
J'ai créer l'algo qui permet de comparer les deux 1ers DataTables en fonction des champs qui m'intéressent.
Comme je boucle sur ces deux derniers, le temps que prend mon programme à s'exécuter est fonction du nombre de lignes concernées. Afin de réduire cela au maximum je supprime au fur et à mesure les lignes que je ne veux pas copier afin de ne pas reboucler dessus au prochain passage. Ce qui fait que je boucle sur un total de ligne d'un DataTable qui évolue. Et ce qui me pète de jolis IndexOutOfRange Exception.
Avec le code ci-dessous, l'erreur est la suivante : Aucune ligne à la position 482.
J'ai donc supprimé 18lignes avant que l'exception pointe le bout de son nez, j'ai donc j=482 et i=0.
J'ai tenté un paquet de coup de Trafalgar mais rien de fonctionne.
J'espère que mon code ne vous paraitra pas trop obscur (sinon ne vous concentrez que sur les conditions des for) :
Merci aux courageux qui tenteront l'expérience...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47 DT = dtas.Clone(); for (int i = 0; i < dtas.Rows.Count; i++) { //on parcourt les lignes de l'AS400 check = false; for (int j = 0; j < dtsql.Rows.Count || dtsql.Rows.Count > 0 || !check; j++) //on parcourt les lignes de SQL Server { if ((string)dtas.Rows[i][dtas.Columns["ORDNO"].Ordinal] == (string)dtsql.Rows[j][dtsql.Columns["SNOF"].Ordinal] && (string)dtas.Rows[i][dtas.Columns["OPSEQ"].Ordinal] == (string)dtsql.Rows[j][dtsql.Columns["SOPE"].Ordinal]) //si le couple clé primaire est identique { if ((string)dtas.Rows[i][dtas.Columns["OPSTC"].Ordinal] != (string)dtsql.Rows[j][dtsql.Columns["SITUATION"].Ordinal] && Convert.ToInt32((string)dtas.Rows[i][dtas.Columns["OPSTC"].Ordinal]) == 0) //si la situation est différente et OPSTC = "00" { DT.Rows.Add(dtas.Rows[i].ItemArray); //on ajoute la ligne au datatable temporaire dtsql.Rows.Remove(dtsql.Rows[j]); //et on supprime la ligne check = true; } if ((string)dtas.Rows[i][dtas.Columns["WKCTR"].Ordinal] != (string)dtsql.Rows[j][dtsql.Columns["SPDC"].Ordinal]) //si les postes sont identiques { DT.Rows.Add(dtas.Rows[i].ItemArray); //on ajoute la ligne au datatable temporaire DT.Rows[DT.Rows.Count - 1][DT.Columns["OPSTC"].Ordinal] = (string)dtsql.Rows[j][dtsql.Columns["SITUATION"].Ordinal]; //on rajoute la situation de SQL Server dtsql.Rows.Remove(dtsql.Rows[j]); //et on supprime la ligne check = true; } if (!check) { dtsql.Rows.Remove(dtsql.Rows[j]); check = true; } } else //si le couple clé primaire est différent { if (Convert.ToInt32(((string)dtas.Rows[i][dtas.Columns["ORDNO"].Ordinal]).TrimStart('M')) > Convert.ToInt32(((string)(dtsql.Rows[j][dtsql.Columns["SNOF"].Ordinal])).TrimStart('M')) || Convert.ToInt32(((string)dtas.Rows[i][dtas.Columns["ORDNO"].Ordinal]).TrimStart('M')) == Convert.ToInt32(((string)(dtsql.Rows[j][dtsql.Columns["SNOF"].Ordinal])).TrimStart('M')) && Convert.ToInt32(((string)dtas.Rows[i][dtas.Columns["OPSEQ"].Ordinal]).TrimStart('M')) > Convert.ToInt32(((string)(dtsql.Rows[j][dtsql.Columns["SOPE"].Ordinal])).TrimStart('M'))) { //si (ORDNO > SNOF) ou (ORDNO = SNOF et OPSEQ > SOPE) dtsql.Rows.Remove(dtsql.Rows[j]); //on supprime la ligne et on passe à la suivante check = true; } } } if (!check) //si non trouvée, on ajoute la ligne au datatable temporaire { DT.Rows.Add(dtas.Rows[i].ItemArray); } }
Partager