script état d'une commande

SOLVED

Bonjour à tous,

j'ai créé un état qui pour une commande donnée listes les produits, les quantités commandées et les quantitées déjà livrées ainsi que les reliquats.
Jusque là, pas de soucis.

J'ai créé un script pour récupérer le numéro de BL associé à chaque partie livrée, dans le cas d'une livraison partielle avec reliquat :

ScriptTypeDirect
LabelErr()

$Etat_Début:
Const kWgcTableIdPieceHCli "00000400E87A0100" // Table : Pièces clients DevName: PieceHCli
Const kWgcFidPieceHCliNum 4 // Rubrique : N° pièce DevName: Num
Const kWgcFidPieceHCliTypePiece 3 // Rubrique : Type de pièce DevName: TypePiece
Const kWgcFidPieceHCliNumPicOri 202 // Rubrique : Pièce d'origine DevName: NumPicOri
Const kWgcFidPieceHCliOrigine 199 // Rubrique : Origine de la pièce DevName: Origine
Const kWgcFidPieceHCliBaseTVA1 77 // Rubrique : Base HT 1 DevName: BaseTVA1

Dim CommandeNum
CommandeNum = [N° pièce\Pièce]
DimEnt I // Variable de boucle
Dim St,St2,ResuBL,TabResu
QueryCreate()
QueryAddTable(kWgcTableIdPieceHCli)
QueryAddCol(kWgcFidPieceHCliNum) //n° pièce [1]
QueryAddCol(kWgcFidPieceHCliTypePiece) //type de pièce [2]
QueryAddCol(kWgcFidPieceHCliNumPicOri) //pièce d'origine [3]
QueryAddCol(kWgcFidPieceHCliOrigine) //origine de la pièce [4]
QueryAddCol(kWgcFidPieceHCliBaseTVA1) // base HT [5]
QueryAddCond(kWgcFidPieceHCliNumPicOri,kCondContain,"Commande - "[N° pièce\Pièce])
QueryExec()
QueryBoucle(I,St,1)

ETR(RubRef([TBLERESULTS.EtLoc]),St,I,1)
FinBoucle
QueryBoucle(I,St2,5)
ETR(RubRef([TBLERESULTS.EtLoc]),St2,I,2)
FinBoucle

[NBRERESULTS.EtLoc]=I

J'ai créé une rubrique tableau pour enregistrer les résultats de ma Query.

Dans mon doc d'édition, j'ai un objet tableau qui 'liste' les produits de ma commande.
Dans une des colonnes, j'ai ceci : 

Si [Qté Livrée]<>""
'"Sur "TblRechCol(RubRef([TBLERESULTS.EtLoc]),SubC([Mt Tot HT],",","."),2,1)
FinSi

Mais ce dernier me renvoie systématiquement la valeur de la 1ère ligne.
D'ailleurs, si j'imprime ma rubrique tableau sous forme de liste, toutes mes lignes sont préfixées/indexées à 0. N'est-ce pas là l'origine du problème ?

  : help !

Parents
  • 0
    SUGGESTED

    Hello,

    Pour commencer, avez bien dimensionner le tableau lors de la définition de la rubrique ?

    Ensuite votre script n'est pas du tout optimisé.
    Ne prendre que les valeurs dont vous avez besoin, vous en demandez 5 pour n'en exploiter que 2
    Ne faire qu'une boucle sur les résultats
    Ne calculer la REF qu'une fois et la mémoriser, ça clarifie le code et va bien plus vite.

    Je n'ai pas testé mais cela donner un truc de ce genre : 

    ScriptTypeDirect // NE SERT A RIEN ICI
    LabelErr() // NE SERT A RIEN ICI


    $Etat_Début:

    //OPTIM importante
    Dim Reftab=RubRef([TBLERESULTS.EtLoc])


    Const kWgcTableIdPieceHCli "00000400E87A0100" // Table : Pièces clients DevName: PieceHCli
    Const kWgcFidPieceHCliNum 4 // Rubrique : N° pièce DevName: Num
    Const kWgcFidPieceHCliTypePiece 3 // Rubrique : Type de pièce DevName: TypePiece
    Const kWgcFidPieceHCliNumPicOri 202 // Rubrique : Pièce d'origine DevName: NumPicOri
    Const kWgcFidPieceHCliOrigine 199 // Rubrique : Origine de la pièce DevName: Origine
    Const kWgcFidPieceHCliBaseTVA1 77 // Rubrique : Base HT 1 DevName: BaseTVA1

    Dim CommandeNum
    CommandeNum = [N° pièce\Pièce]
    DimEnt I // Variable de boucle
    Dim St
    QueryCreate()
    QueryAddTable(kWgcTableIdPieceHCli)
    QueryAddCol(kWgcFidPieceHCliNum) //n° pièce [1]
    QueryAddCol(kWgcFidPieceHCliBaseTVA1) // base HT [2]
    QueryAddCond(kWgcFidPieceHCliNumPicOri,kCondContain,"Commande - "[N° pièce\Pièce])
    QueryExec()


    QueryBoucle(I,St,1)
    ETR(Reftab,St,I,1)
    ETR(Reftab,QueryResult(I,2),I,2)
    FinBoucle

    [NBRERESULTS.EtLoc]=I


    Si [Qté Livrée]<>""
    "Sur "TblRechCol(RubRef([TBLERESULTS.EtLoc]),SubC([Mt Tot HT],",","."),2,1)
    FinSi

    Faites nous savoir si cette réponse a été utile en la marquant comme vérifiée.

    Pour cela, au niveau de la réponse apportée, cliquer sur l'option "Vérifier la réponse".

    Cela aura pour effet de marquer la réponse en vert et de permettre aux autres membres de la communauté, ou aux personnes qui auraient également le besoin de voir que cela a fonctionné.

    Merci d'avoir utilisé la communauté.


    Bonne continuation

  • 0 in reply to Phildem

    Merci encore   pour votre aide.
    J'ai optimisé dans ce sens mais j'obtiens le même résultat (cad que lorsque je recherche la valeur "549.96" qui est en 2ème ligne 2ème colonne de mon tableau, je reçois systématiquement la 1ère ligne....
    En revanche si je 'restreint' les paramètres de recherche en demandant à la fonction 'TblRechCol' de ne chercher qu'à partir de la ligne 2, j'obtiens le bon résultat..... :-(

  • 0 in reply to Emmanuel GADEK
    SUGGESTED

    Hello,
    C'est étrange essayez avec TblRechCol(RubRef([TBLERESULTS.EtLoc]),SubC([Mt Tot HT],",","."),2,1,,,kTypeNumFlot)

    Sinon activez la mise au point :

     

    puis ajoutez les lignes 

    Trace()
    Espion()

    Après la boucle de querry
    cela vous permettra d'éxaminer le contenu des rubrique et donc du tableau...

    Important: une fois le debug terminé, il est important d'enlever les fonctions trace et surtout de désactiver la mise au point.

    Faites-nous savoir si la réponse vous a été utile en la marquant comme vérifiée . Pour cela, cliquez sur l’option « Vérifier la réponse ».

Reply
  • 0 in reply to Emmanuel GADEK
    SUGGESTED

    Hello,
    C'est étrange essayez avec TblRechCol(RubRef([TBLERESULTS.EtLoc]),SubC([Mt Tot HT],",","."),2,1,,,kTypeNumFlot)

    Sinon activez la mise au point :

     

    puis ajoutez les lignes 

    Trace()
    Espion()

    Après la boucle de querry
    cela vous permettra d'éxaminer le contenu des rubrique et donc du tableau...

    Important: une fois le debug terminé, il est important d'enlever les fonctions trace et surtout de désactiver la mise au point.

    Faites-nous savoir si la réponse vous a été utile en la marquant comme vérifiée . Pour cela, cliquez sur l’option « Vérifier la réponse ».

Children
  • 0 in reply to Phildem

    Bonjour  , désolé pour la réponse tardive. Où puis-je trouver cette option 'Mise au point des scripts' ?

  • 0 in reply to Emmanuel GADEK
    SUGGESTED

    Hello, ajouter la tâche "Mise au au point" famille "Divers" et dans le paramètres de la tâche "Mise au point". Il y a un onglet ensuite avec l'option.

  • 0 in reply to Phildem

    Re bonjour  , désolé pour ce 'décalage' systématique dans mes interractions et réponses.
    J"ai activé les paramètres de Mise au point et de fenêtres espions.
    J'arrive bien à afficher mon tableau (voir capt écran ci-jointe).
    La 1ère valeur [Mt Tot HT] que je recherche dans mon objet colonne est '549.96', que l'on voit bien présent dans la capture d'écran en 2ème ligne. Je devrais obtenir en résultat 'BL-00211' alors que j'obtiens 'BL-00184' :-(

  • 0 in reply to Emmanuel GADEK
    SUGGESTED

    Hello,

    J'ai fait le petit script suivant qui fonctionnent semble t'il et montre que la fonction est OK

    ScriptTypeDirect
    LabelErr()

    Trace()

    Dim tt

    ETbl(tt,"BL-00184",1,1)
    ETbl(tt,"662.55",1,2)


    ETbl(tt,"BL-00211",2,1)
    ETbl(tt,"594.96",2,2)


    ETbl(tt,"BL-00232",3,1)
    ETbl(tt,"3334.52",3,2)

    Espion(TblRechCol(RubRef(tt),"594.96",2,1))

    Je pense que le problème viens du type, il pense que c'est du numérique et comprend 662.55 comme du numérique invalide et donc 0 ...
    Le format de nombre est celui du système et sauf dans les constantes dans les sources des scripts ou il faut mettre . il faut laisser le séparateur décimal système, donc la virgule en France.
    Dans mon test, je force le texte par des "" et ça fonctionne.
    Dans votre cas, commencez par ne pas forcer le format lors de l'écriture et recherche, je pense que cela ira mieux.

    Bonne journée.


  • 0 in reply to Phildem
    SUGGESTED

    Merci  ,

    j'étais justement en train d'investiger en me disant également que le problème venait du type.
    Lors de mes derniers tests, j'avais supprimé la fonction SubC dans le TblRechCol pour ne pas procéder à des conversions virgule vers point. Mais sans obetnir de meilleurs résultats. Quant à l'entrée des valeurs dans le tableau, aucune conversion n'est opérée à cet endroit.....
    Je me demande plutôt si le problème ne provient pas du fait que [Mt Tot HT] est de type 'Monnaie' et non chiffre décimal.
    Existe-t-il un moyen de faire une conversion 'à la volée' vers un type décimal.
    Est-il possible de 'faire parler' une variable en affichant son type dans une console ou avec la fonction 'Message' ?

    ** EDIT **
    Mon problème semble résolu en procédant au contraire à un 'SubC' virgule vers point en entrée de tableau ET en recherche dans le tableau

  • +1 in reply to Emmanuel GADEK
    verified answer

    Hello, en effet, en faisant cela la détermination du type auto considère tout comme du text.
    Les scripts pour des raisons de simplicités à la base ont une gestion des types simplifiée et automatique, mais dans certains cas, il faut se battre avec Slight smile
    Je pense que sans jamais faire de subc dans les 2 endroits et en ajoutant le type dans la recherche ça peut aussi fonctionner.
    Espion(TblRechCol(RubRef(tt),"594.96",2,1,,,kTypeText))
    Enfin l'important est que cela fonctionne (Attention aussi avec le séparateur de millier (qui n'est pas un espace mais un espace non sécant, faire un test pour ce cas))
    Bonne continuation

  • 0 in reply to Phildem

    En effet.
    Si le séparateur de milliers est un espace non sécant comment le 'matérialiser' dans un SubC ?
    Merci en tous cas pour votre aide précieuse !

  • 0 in reply to Emmanuel GADEK
    SUGGESTED

    Hello, je vous conseille d'utiliser la fonction Fx, ce sera bien plus simple (tout en centime sans aucun séparateurs)
    Voir cette exemple:

    ScriptTypeDirect
    LabelErr()


    Message(Fx(10/3,kNum2,Faux,Vrai,Faux))
    Message(Fx(0,kNum2,Vrai,Faux,Faux))
    Message(Fx(1234.56,kNum2,Vrai,Faux,Faux))
    Message(Fx(-0.01,kNum2,Faux,Vrai,Faux))
    Fin