Page 1 sur 2

ScrollBarGadget limité à 10.000

Publié : mer. 14/sept./2016 9:32
par microdevweb
Bonjour à tous,

Dans le cadre de ma table j'utilise des scroolBar, dans mes testes la Db faisant + 10.000 record j'ai un message d'erreur "La valeur d'un scrollBarGadget doit être comprise entre 0 et 10.000.

Un idée pour passé cette limite ?

Merci

Re: ScrollBarGadget limité à 10.000

Publié : mer. 14/sept./2016 10:09
par falsam
Hello Micro. Est ce que tu crois qu'un utilisateur sain d'esprit va parcourir une liste de 10000 lignes ? Je pense que tu dois mettre en place un système de pagination.

Etant donné que tu utilises SQL ça va pouvoir se faire les doigts dans le nez ^^

Re: ScrollBarGadget limité à 10.000

Publié : mer. 14/sept./2016 10:11
par Kwai chang caine
Est ce que tu crois qu'un utilisateur sain d'esprit va parcourir une liste de 10000 lignes ?
Evidemment que non, pfffff !!! :roll:

Par contre.... 14 000 comme mon fichier disque, ....... tous les jours ...... :mrgreen:

Et je parle pas des taquets souvent atteints avec Excel 2000 des 65 000 lignes au boulot :lol:

Re: ScrollBarGadget limité à 10.000

Publié : mer. 14/sept./2016 10:15
par falsam
Kwai chang caine a écrit :Par contre.... 14 000 comme mon fichier disque, ....... tous les jours ......
j'ai bien dis utilisateurs sains d'esprit :mrgreen:

Re: ScrollBarGadget limité à 10.000

Publié : mer. 14/sept./2016 10:16
par Kwai chang caine
Aaaah !!! j'avais pas vu ... je me disais aussi ... :mrgreen:

Re: ScrollBarGadget limité à 10.000

Publié : mer. 14/sept./2016 10:17
par falsam
pas grave on t'aime bien au village de Purebasic :p

Re: ScrollBarGadget limité à 10.000

Publié : mer. 14/sept./2016 10:19
par Kwai chang caine
Moi aussiiiiii !!!
Merci :D

Image

Re: ScrollBarGadget limité à 10.000

Publié : mer. 14/sept./2016 10:35
par falsam
@Micro: Mettre en place un système de pagination avec ta liste est simple.

Tu connais le nombre de lignes visibles même si l'utilisateur resize ta liste.

Cas d'école : Le nombre de lignes visible est de 100 et l'utilisateur consulte une table de code postaux.

­■ La selection SQL de la première page sera
select * from CodePostaux limit 0, 99

■ L'utilisateur clique sur le bouton page suivante. La requête sera
select * from CodePostaux limit 100, 199

Etc ...

Tu peux faire la même chose avec la molette de la souris en sachant qu'un déplacement de molette fait un saut de 10 lignes.

Re: ScrollBarGadget limité à 10.000

Publié : mer. 14/sept./2016 10:56
par microdevweb
Il y à un système de pagination, ce dernier est régit par un scrollbar

Code : Tout sélectionner

Procedure DrawData()
        Protected req.s,lOf,lTo,N,Y,X,YT,XT,CurrentDataLine,Color,Txt.s
        Protected  CalculFunction.proCalcul
        With myTable()
            req=\req
            ; Ajout des limites de lecture de la table
            ; Si l'acensseur vertical est actif on le prend en compte
            If IsGadget(\IdScrollV)
                lOf=GetGadgetState(\IdScrollV)
                CurrentDataLine=GetGadgetState(\IdScrollV)
            EndIf
            ; Ajout de where clause
            If \WhereClause<>""
                req+" WHERE "+\WhereClause
                If \FiltersClause<>""
                    req+" AND "+\FiltersClause
                EndIf
            EndIf
            If \WhereClause="" And \FiltersClause<>""
                req+" WHERE "+\FiltersClause
            EndIf
            ; Ajout du tri à la table
            req+\OrderClause
            lTo=\NumberLine
            req+" LIMIT "+Str(lOf)+","+Str(lTo)+" "
            If DatabaseQuery(\IdDb,req)=0
                MessageRequester("DrawData Error",DatabaseError(),#PB_MessageRequester_Error)
                ProcedureReturn #False
            EndIf
            ; Efface les ligne en mémoire
            ClearList(myDataLine())
            ; On commence sous le titre de colonne
            Y=\myProperties\ColumnTitleHeight
            While NextDatabaseRow(\IdDb)
                X=0
                AddElement(myDataLine())
                ; Sauvegarde de l'id
                myDataLine()\Id=GetDatabaseLong(\IdDb,0)
                ; Si aucune ligne n'est sélectionnée on sélectionne la première ligne
                If \IdLigneSelected=-1
                    \IdLigneSelected=myDataLine()\Id
                EndIf
                ; Choix de la couleur et la police suivant que la ligne sélectionnée paire ou impaire
                If myDataLine()\Id=\IdLigneSelected ; Si la ligne est sélectionnée
                                                    ; Dessin du cadre de sélection
                    AddPathBox(0,Y,\TotalWidthColumn,\myProperties\LineHeight)
                    VectorSourceColor(\myProperties\SelectLineColors\Bg)
                    FillPath()
                    ; Choix de la police
                    VectorFont(FontID(\myProperties\SelectLineFont))
                    Color=\myProperties\SelectLineColors\Fg
                Else ; La ligne n'est pas sélectionnée
                    If CurrentDataLine & 1 ; Ligne impaire
                        VectorFont(FontID(\myProperties\OddLineFont))
                        Color=\myProperties\OddLineColors\Fg
                    Else ; ligne pair
                        VectorFont(FontID(\myProperties\PairLineFont))
                        Color=\myProperties\PairLineColors\Fg
                    EndIf
                EndIf
                ; Centrage de la ligne horizontalement
                YT=Y+(\myProperties\LineHeight/2)
                YT-(VectorTextHeight("W")/2)
                ; Parcour de toutes les colonnes
                N=0
                ; Trie la liste sur l'ordre
                SortStructuredList(myTable()\myColumn(),#PB_Sort_Ascending,OffsetOf(Column\Order),TypeOf(Column\Order))
                ForEach \myColumn()
                    AddElement(myDataLine()\myColumn())
                    ; Si pas une colonne mémoire
                    If \myColumn()\DbColumnName<>""
                        N+1
                        Select DatabaseColumnType(\IdDb,N)
                            Case #PB_Database_Long
                                myDataLine()\myColumn()\Type=#PB_Database_Long
                                myDataLine()\myColumn()\Value=Str(GetDatabaseLong(\IdDb,N))
                            Case #PB_Database_String
                                myDataLine()\myColumn()\Type=#PB_Database_String
                                myDataLine()\myColumn()\Value=GetDatabaseString(\IdDb,N)
                            Case #PB_Database_Float 
                                myDataLine()\myColumn()\Type=#PB_Database_Float
                                myDataLine()\myColumn()\Value=StrF(GetDatabaseLong(\IdDb,N))
                            Case #PB_Database_Double
                                myDataLine()\myColumn()\Type=#PB_Database_Double
                                myDataLine()\myColumn()\Value=StrD(GetDatabaseLong(\IdDb,N))
                            Case #PB_Database_Quad  
                                myDataLine()\myColumn()\Type=#PB_Database_Quad
                                myDataLine()\myColumn()\Value=StrD(GetDatabaseLong(\IdDb,N))
                            Case #PB_Database_Blob  
                                MessageRequester("DrawData Error","The blob type is not available with this module",#PB_MessageRequester_Error)
                                ProcedureReturn #False
                        EndSelect
                    Else ; Si une colonne mémoire
                         myDataLine()\myColumn()\Type=-1 ; Colonne mémoire
                        If \myColumn()\CalculateCallback>-1
                            CalculFunction=\myColumn()\CalculateCallback
                             myDataLine()\myColumn()\Value=CalculFunction(GetDatabaseLong(\IdDb,0))
                        EndIf             
                    EndIf
                    ; Contatene le texte si nécessaire
                    Txt=myDataLine()\myColumn()\Value
                    While  VectorTextWidth(Txt)>(\myColumn()\Widht-(\myColumn()\Margin*2))
                        Txt=Left(Txt,Len(Txt)-4)
                        Txt+"..."
                    Wend    
                    ; Mise en place du texte dans la colonne
                    Select \myColumn()\Alignment
                        Case #Left
                            XT=X+\myColumn()\Margin
                        Case #Right
                            XT=X+(\myColumn()\Widht-(VectorTextWidth(Txt)+\myColumn()\Margin))
                        Case #Center
                            XT=X+(\myColumn()\Widht/2)
                            XT-VectorTextWidth(Txt)/2
                    EndSelect
                    ; Dessin du texte
                    VectorSourceColor(Color)
                    MovePathCursor(XT,YT)
                    DrawVectorText(Txt)
                    X+\myColumn()\Widht
                Next
                Y+\myProperties\LineHeight
                CurrentDataLine+1
            Wend
        EndWith
    EndProcedure

Re: ScrollBarGadget limité à 10.000

Publié : mer. 14/sept./2016 10:57
par Zorro
falsam a écrit : Tu peux faire la même chose avec la molette de la souris en sachant qu'un déplacement de molette fait un saut de 10 lignes.
heu ... t'es sur de ça ??
ça doit dependre de la souris non ? , voir du paramétrage du scroll ..? , de mémoire le scroll des ascensseurs peut se modifier non ?

Re: ScrollBarGadget limité à 10.000

Publié : mer. 14/sept./2016 11:23
par microdevweb
Je penses ne pas avoir été clair.

Il y à une pagination sur la table seul les record affichés sont lu dans la base de données. Par contre le système n'est pas régis par des page 1,2,3,4 etc mais par un scrollbar, qui donne le premier record à affiché la valeur total du scrollbar est (NbRecord Db - Nb ligne affichées). La molette de la souris est également gérée.

Ma première table faisait appel à un scroolbar (personnalisé et dessiné dans le canvas) ne posait pas ce type de problème mais cela compliquait le code.

Il me reste donc deux solution, faire un scroll maison ou ajouté des pages au scroll

Ex= de 0 à 10.000 page 1 après j'ajoute une page et fait remonté le scroll à 0. Mais bon se n'est pas des plus propre

Re: ScrollBarGadget limité à 10.000

Publié : mer. 14/sept./2016 11:30
par falsam
ça veut dire que tu lis la totalité d'une table par exemple pour afficher seulement 100 lignes si la partie visible de ton tableau est de 100 lignes ?

Re: ScrollBarGadget limité à 10.000

Publié : mer. 14/sept./2016 12:21
par microdevweb
Si la table sql comprend 100 lignes et que la table affichée est de 100 lignes en effet je lis la totalité. Mais si seulement 10 ligne sont affichées je lirais 10 lignes

Exemple:

Code : Tout sélectionner

req="SELECT * FROM client LIMIT +"gestGadgetState(IdScroll)+",10"

Re: ScrollBarGadget limité à 10.000

Publié : mer. 14/sept./2016 16:30
par Marc56
Dans ce style d'appli, je commence par un SELECT COUNT(*) FROM ...
suivi d'une pagination forcée (comme avec les pages web)
ou
forcer l'utilisateur à affiner.

Objectifs:
- Penser que tout le monde n'a pas une machine aussi puissante que les développeurs (vu trop souvent... :!: )
- Libérer la mémoire à chaque page vue
- En milieu pro: Ne pas faciliter le travail d'un "utilisateur" qui voudrait embarquer d'un coup toute la base de données sur une clé usb ... :roll:

Re: ScrollBarGadget limité à 10.000

Publié : ven. 16/sept./2016 9:39
par microdevweb
Pour résoudre mon soucis je vais utilisé mon module ScrollBarCanvas que j'avais déjà créer précédement pour un autre projet. Je place le lien ci-dessous pour ceux que cela intéresse.

https://github.com/microdevweb/ScrollCa ... master.zip