Pages: 1
- Sujet précédent - [MB 8.5]Condition Len pas respectée ou forcer la sortie d'un End IF - Sujet suivant
#1 Wed 18 August 2010 15:54
- V. Girault
- Participant actif
- Lieu: Clermont-Ferrand
- Date d'inscription: 22 Sep 2005
- Messages: 106
[MB 8.5]Condition Len pas respectée ou forcer la sortie d'un End IF
Bonjour à tous !
J'essaie en ce moment de créer un algo de création d'étiquette multiligne. Je pensais avoir écris mon script correctement, mais force tests, je constate qu'une simple condition sur une longueur maxi de chaine n'est pas respectée, alors que physiquement, dans la table sur laquelle je travaille, elle est respectée une fois. (Elle pourrait d'ailleurs à l'avenir être respectée X fois). Ma première idée est alors de forcer la sortie de la condition If dans laquelle le test de longueur de chaine se trouve, si la condition n'est pas respectée. J'ai essayé de placer un "Exit Do" mais apparemment il n'est pas bien placé. Mon idée est t'elle bonne et si oui où devrais-je le placer ?
Voici mon code ci-dessous :
Code:
For NBC = 1 to TableInfo(TableU, TAB_INFO_NCOLS) COPE = ColumnInfo(TableU, "COL"&NBC, COL_INFO_NAME) For Enr = 1 to TableInfo(TableU, TAB_INFO_NROWS) If COPE = "OPERATION" Then C_ETI1 = TableU & "." & COPE Fetch first from TableU Do While Not EOT(TableU) If Len(C_ETI1)>38 then C_ID = TableU & "." & ID Select * from TableU Where Enr = C_ID Into Query1 OPE_L = Len(C_ETI1) SOpe = C_ETI1 For N_Carac = 1 to OPE_L Carac = Mid$(C_ETI1, N_Carac, 1) If Carac = "+" Then iCR = iCR + 1 'Trouver ici la longueur Max du champ Etiq1 3 caractères avant le + pour la future table d'étiquettes ChaineD ="" For NbOCR = 1 to 1 NbCharChainePart = N_Carac - 3 ChaineD = Left$(C_ETI1, NbCharChainePart) ChaineF = Mid$(C_ETI1, N_Carac, N_Carac - OPE_L) Note ChaineD Note ChaineF Next End If Next 'Note "SOpe : "+SOpe Commit Table Query1 As "C:\Cartographic Automate V2\TABLES\"+TableU+"_TEMP.TAB" CoordSys Earth Projection 3, 33, "m", 3, 46.5, 44, 49.00000000001, 700000, 6600000 Bounds (-792421, 5278231) (3520778, 9741029) Else Exit Do End If Fetch Next from TableU Loop
Sinon, je ne m'explique pas pourquoi ma condition elle, ne passe pas. Dans ma table Query1, je n'ai pas la ligne qui m'intéresse...
Pourriez-vous m'aider là-dessus ? Ca fait un moment que je traine sur cet algo, et là, je ne comprends pas ce qui se passe.
Merci beaucoup d'avance pour votre aide toujours si salvatrice...
Hors ligne
#2 Wed 18 August 2010 17:28
- jean94
- Participant assidu
- Date d'inscription: 13 Aug 2009
- Messages: 436
Re: [MB 8.5]Condition Len pas respectée ou forcer la sortie d'un End IF
Bonjour, je ne comprend pas beaucoup ton code mais voici ce que je remarque
Ton exit do arrete completement ton algo...donc j'imagine que ta 2ieme ligne a plus de 38 char.
Je crois qu'il n'est pas nécéssaire de mettre un Else...donc si If Len(C_ETI1)>38 then est faut, il passera à l'autre l'autre ligne automatiquement sans else.
JF
Dernière modification par jean94 (Wed 18 August 2010 17:28)
Hors ligne
#3 Thu 19 August 2010 10:27
- V. Girault
- Participant actif
- Lieu: Clermont-Ferrand
- Date d'inscription: 22 Sep 2005
- Messages: 106
Re: [MB 8.5]Condition Len pas respectée ou forcer la sortie d'un End IF
Bonjour à tous et merci à jean94 de m'avoir répondu...
J'ai nettoyé le code en conséquence par rapport à ce que tu signalais. J'ai de plus supprimé temporairement le traitement des chaines pour faciliter la lecture et le pistage du problème que je rencontre toujours. Voilà ce que çà donne avec un petite explication de ce que fait l'algo en tête de code :
Code:
'Programmer une traitement de scission de champ en 38 caractères sur 2 lignes 'Récupérer la valeur ID et OPERATION de chaque record sélectionné de la table en sortie de requête 'Contrôler la longueur du champ OPERATION. Si celui-ci atteint 38 caractères, mettre l'étiquette 'sur 2 lignes. 'Lire tous les records de la table pour définir la taille de chaque valeur du champ OPERATION Note ("Avertissement : "+Chr$(13)+ "La valeur du champ va être tronqué si sa longueur excède"+Chr$(13)+ "38 caractères. Ne seront conservés que les renseignements"+Chr$(13)+ "strictement nécessaires.") For NBC = 1 to TableInfo(TableU, TAB_INFO_NCOLS) COPE = ColumnInfo(TableU, "COL"&NBC, COL_INFO_NAME) For Enr = 1 to TableInfo(TableU, TAB_INFO_NROWS) If COPE = "OPERATION" Then C_ETI1 = TableU & "." & COPE C_ID = TableU & "." & ID Note "Enr : "+Enr 'Note "C_ID : "+C_ID Fetch first from TableU If Len(C_ETI1)>38 then 'C_ID = TableU & "." & ID Note "C_ID : "+C_ID Note "Len(C_ETI1) : "+Len(C_ETI1) Select * from TableU Where C_ID = Enr Into Query1 SOpe = C_ETI1 ....... Commit Table Query1 As "C:\Cartographic Automate V2\TABLES\"+TableU+"_TEMP.TAB" CoordSys Earth Projection 3, 33, "m", 3, 46.5, 44, 49.00000000001, 700000, 6600000 Bounds (-792421, 5278231) (3520778, 9741029) End If Fetch Next from TableU End If Next Next
Avec les notes de test que l'on peut voir dans ce script, je n'obtient que les valeurs de Enr à savoir respectivement 1,2,3,4 et 5. Il y a effectivement 5 records dans la table. C_ID quant à lui ne rend aucune variable, encore moins donc mon test de la longueur de C_ETI1 et tout le code dessous également, alors qu'actuellement j'ai un champ OPERATION, donc C_ETI1 qui à une longueur de 39 caractères... Le test ne doit pas être faux puisque mon champ de + de 38 caractères existe dans ma table.... C'est çà que je ne comprend pas, pourquoi ce test simple de prime abord, de longueur de chaine ne fonctionne pas ?
Merci beaucoup par avance de l'aide apportée....
Dernière modification par V. Girault (Thu 19 August 2010 10:27)
Hors ligne
#4 Thu 19 August 2010 11:02
- Patrick PALMIER
- Participant actif
- Lieu: Lille
- Date d'inscription: 18 Jan 2007
- Messages: 97
Re: [MB 8.5]Condition Len pas respectée ou forcer la sortie d'un End IF
Bonjour,
Les variables C_ETI1 et C_ID sont t-elles bien de type Alias
Sinon les déclarer comme telles
Dim C_ETI1,C_ID as alias
Hors ligne
#5 Thu 19 August 2010 12:25
- V. Girault
- Participant actif
- Lieu: Clermont-Ferrand
- Date d'inscription: 22 Sep 2005
- Messages: 106
Re: [MB 8.5]Condition Len pas respectée ou forcer la sortie d'un End IF
Bonjour,
Mais oui, absolument....
Voici ci-dessous, la déclaration de toutes les variables privées :
Code:
Dim Ntable, TableU, SOpe, COPE, Carac as String Dim NbTO,OPE_L as SmallInt Dim W, Enr, NBC, N_Carac, NbCharChainePart, iCR, NbOCR as Integer Dim C_ETI1, C_ID as Alias Dim ChaineD, ChaineF as String
Merci beaucoup d'avance pour votre aide...
Hors ligne
#6 Thu 19 August 2010 13:43
- Patrick PALMIER
- Participant actif
- Lieu: Lille
- Date d'inscription: 18 Jan 2007
- Messages: 97
Re: [MB 8.5]Condition Len pas respectée ou forcer la sortie d'un End IF
Bonjour,
En fait, il me semble que le "Fetch first from TableU" est mal placé. Il doit se trouver juste avant "For Enr = 1 to TableInfo(TableU, TAB_INFO_NROWS)" car cette commande replace le curseur sur la première ligne pour toutes les lignes de TableU. En fait, il me semble que pour toutes les lignes de tableU vous tester les étiquettes de la première lignes uniquement
Ca devrait ensuite marcher
Hors ligne
#7 Thu 19 August 2010 14:48
- V. Girault
- Participant actif
- Lieu: Clermont-Ferrand
- Date d'inscription: 22 Sep 2005
- Messages: 106
Re: [MB 8.5]Condition Len pas respectée ou forcer la sortie d'un End IF
Merci beaucoup à Patrick PALMIER de m'avoir répondu si vite... !
Effectivement, l'algo fonctionne désormais tout à fait correctement et enregistre le record tant convoité dans une table à part. Il s'agissait ici de récupérer en premier lieu un champ donné dont la taille en caractère dépasse 38 caractères, afin ensuite d'enregistrer la ligne de table correspondant à ce champ dans une autre table pour constituer ensuite l'étiquette multi ligne correspondante.
Voilà le code propre du script :
Code:
For NBC = 1 to TableInfo(TableU, TAB_INFO_NCOLS) COPE = ColumnInfo(TableU, "COL"&NBC, COL_INFO_NAME) Fetch first from TableU For Enr = 1 to TableInfo(TableU, TAB_INFO_NROWS) If COPE = "OPERATION" Then C_ETI1 = TableU & "." & COPE C_ID = TableU & "." & ID If Len(C_ETI1)>38 then Select * from TableU Where C_ID = Enr Into Query1 ...... Commit Table Query1 As "C:\Cartographic Automate V2\TABLES\"+TableU+"_TEMP.TAB" CoordSys Earth Projection 3, 33, "m", 3, 46.5, 44, 49.00000000001, 700000, 6600000 Bounds (-792421, 5278231) (3520778, 9741029) End If Fetch Next from TableU End If Next Next
Merci encore à Patrick PALMIER....
Hors ligne
Pages: 1
- Sujet précédent - [MB 8.5]Condition Len pas respectée ou forcer la sortie d'un End IF - Sujet suivant