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
LoopSinon, 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
NextAvec 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 StringMerci 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
NextMerci 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


