Nous utilisons des cookies pour vous garantir la meilleure expérience sur notre site. Si vous continuez à utiliser ce dernier, nous considèrerons que vous acceptez l'utilisation des cookies. J'ai compris ! ou En savoir plus !.
banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

Annonce

Rencontres QGIS 2025

L'appel à participation est ouvert jusqu'au 19 janvier 2025!

#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

 

Pied de page des forums

Powered by FluxBB