sam. 09 décembre 2017, 14h23
eddymaue
atoutfox.public.association
Re: Chaînes de caractères: Une chaîne est la suite de la précédente ?
allo a tous
c'est un probleme si simple a traiter avec une table
* quelques definitions de mon fichier condition.h
#Define true .T.
#Define false .F.
#Define IsTrue = .T.
#Define IsFalse = .F.
#Define SetTrue Store true To
#Define SetFalse Store false To
* Creation d'une table
Private gc_name ; && nom de la table
gc_fld : && champs a travailler
m.gc_name = "csrSerie"
m.gc_fldname = "iid"
m.gc_fldtype = "c(1)"
*Set Step On
Create Cursor (m.gc_name) ( &gc_fldname &gc_fldtype )
Clear
? "avant :", Fsize(gc_fldname)
AjoutSerie(m.gc_name , m.gc_fldname , "v5bf")
?? " apres ",Fsize(gc_fldname)
? "avant :", Fsize(gc_fldname)
AjoutSerie(m.gc_name , m.gc_fldname , "v3af")
?? " apres ",Fsize(gc_fldname)
? "avant :", Fsize(gc_fldname)
AjoutSerie(m.gc_name , m.gc_fldname , "v125bf")
?? " apres ",Fsize(gc_fldname)
? "avant :", Fsize(gc_fldname)
AjoutSerie(m.gc_name , m.gc_fldname , "v125ba")
?? " apres ",Fsize(gc_fldname)
? "avant :", Fsize(gc_fldname)
AjoutSerie(m.gc_name , m.gc_fldname , "v125bd")
?? " apres ",Fsize(gc_fldname)
? "avant :", Fsize(gc_fldname)
AjoutSerie(m.gc_name , m.gc_fldname , "v125bb")
?? " apres ",Fsize(gc_fldname)
? "avant :", Fsize(gc_fldname)
AjoutSerie(m.gc_name , m.gc_fldname , "v125be")
?? " apres ",Fsize(gc_fldname)
*Set Step On
?
? 'avant indexation '
? ' ---------------- '
Scan all
? Recno(), &gc_fldname
Endscan
Index on &gc_fldname tag &gc_fldname
Set Order To iid
?
? 'apres indexation '
? ' ---------------- '
Scan all
? Recno(), &gc_fldname
Endscan
Procedure AjoutSerie(tcTable, tcFld, tcItem)
Local success
SetTrue Sucess
Do Case
Case success IsTrue
&& inutile ici mais dans une procédure avec beaucoup de profondeur
cela sert
&& à valider les traitements antérieurs
Case Vartype(m.tcItem) =="C" IsFalse
&& test le type et si c'est de type STRING je trim
Assert .F. Message "tcItem n'est pas de type STRING"
SetFalse success
Case doTrim(@tcItem) IsFalse
Case Empty(tcItem) IsTrue
Assert .F. Message "tcItem est vide"
SetFalse success
Case DoCmpSize_Arg_Fld( m.tcTable , m.tcFld , m.tcItem) IsFalse
&& compare les longueurs argument et du champs
Otherwise
Insert Into (tcTable) (&tcFld) Values (tcItem)
Endcase
Return .T.
Procedure DoCmpSize_Arg_Fld(tcTable, tcFld , tcItem )
Assert Vartype( tcTable ) =="C" Message "'tcTable' doit etre de type
string"
Assert Vartype( tcFld ) =="C" Message "'tcFld' doit etre de type
string"
Assert Vartype( tcItem ) =="C" Message "'tcItem' doit etre de type
string"
Local lnLongueurItem As Integer
Local lnLongueurFld As Integer
Local lcDescFld As Character
Local lcColTypeSize As Character
m.lnLongueurItem = Len(m.tcItem)
m.lnLongueurFld = Fsize( m.tcFld , m.tcTable)
If m.lnLongueurItem > m.lnLongueurFld
m.lcDescFld = m.tcFld + " C("+Transform(m.lnLongueurItem)+")"
Alter Table &tcTable Alter Column &lcDescFld
Endif
Return true
Procedure doTrim(tcItem)
Store Alltrim(tcItem) To tcItem
Return true
Marc Thivolle a couché sur son écran :
> Bonjour,
> Le problème avec ta fonction est que tu traduis en base 10 une numérotation
> qui comprend 36 symboles. Ca ne peut pas marcher. Par exemple les chaines
> 'AK' et 'BA' ont la même représentation, soit 725. D'où la nécessité de bien
> prendre une base 36 pour assurer une bijection entre la chaine passée en
> paramètre et le numérique renvoyé par la fonction..
> Attention : dans l'exemple que j'ai fourni, il faut faire attention à la
> précision autorisée pour un numérique dans VFP. Au delà de 8 caractères le
> résultat est aléatoire.
--
a+ Eddy
L'incompréhensible se réalise toujour avant le compréhensible parce que
tout simplement on ne l'a pas encore assimilé
Permalink : http://www.atoutfox.org/nntp.asp?ID=0000018661