IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Composants Java Discussion :

JTable et gros volumes


Sujet :

Composants Java

  1. #1
    Expert confirmé
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Par défaut JTable et gros volumes
    Bonjour,

    J'utilise une JTable pour afficher les données provenant d'une BDD. Lorsque le nombre de lignes ramenées est important, les temps de réponses s'effondrent.
    Il me faudrait probablement mettre en place un système de pagination.
    Cela existe t-il déjà ?
    Si, par exemple je ramène 1000 lignes, à quel moment dois-je ramener les 1000 suivantes, sans qu'il n' y ait de "trou" dans la table ? (c'est à dire que les données semblent contigües ?)

  2. #2
    Membre très actif
    Avatar de william44290
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Juin 2009
    Messages
    400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 400
    Par défaut
    Je ramene autant de ligne que le jtable peut afficher.
    C'est l'ulitisateur qui déclenche le rechargement des pages.

  3. #3
    Expert confirmé
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Par défaut
    Vous voulez-dire que si la JTable affiche 20 lignes, vous fetchez 20 lignes à chaque fois ?

    Mais si la JTable peut être agrandie par l'utilisateur, comment gérez-vous les nouvelle lignes ?

  4. #4
    Membre émérite Avatar de Heimdal
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    549
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 549
    Par défaut
    Salut,

    je ne sais pas si ça te donnera des idées mais si j'avais à le faire, ma première idée serait de tout ramener, stocker ça en cache et afficher par bloc depuis le cache.
    Une linkedList serait un bon candidat pour stocker ces éléments et pouvoir en ajouter/enlever efficacement.
    Je collerai à ces données des status pour savoir ou j'en suis(MODIFIED, CREATED, DELETED).

    Après si vraiment tu as une masse énorme de données en base, ça sera compliqué de tout garder en cache et peut-être seras-tu obligé de les ramener par bloc.

    ++

  5. #5
    Membre très actif
    Avatar de william44290
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Juin 2009
    Messages
    400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 400
    Par défaut
    oui c'est cela je charge 20 lignes, le nombre de lignes à charger est une variable qui est mis à jour par l'utilisateur via l'ihm.
    tu peux récupérer sur mon site mon appli pour voir comment cela marche.

  6. #6
    Membre Expert
    Avatar de gifffftane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 354
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 2 354
    Par défaut
    Normalement il n'y a besoin de ne rien faire, si l'on peut dire. La JTable n'appelle que les valeurs des lignes qu'elle affiche. Donc, s'il y a 5 millions de lignes dans ta JTable, et que, selon la situation du JScrollPane qui la contient, on ne voit que 12 lignes, la JTable ne demande que la valeur des 12 valeurs concernées.

    À toi de gérer au niveau du modèle, bien sûr.

  7. #7
    Expert confirmé
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Par défaut
    Le problème, c'est le temps d'affichage. Il ne faut pas que l'utilisateur attende 2 minutes que la LOV s'affiche avec ses centaine de milliers de lignes...

  8. #8
    Membre très actif
    Avatar de william44290
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Juin 2009
    Messages
    400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 400
    Par défaut
    Salut, as-tu regardé comment je traite ma pagination de jtable ?

  9. #9
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Par défaut
    Citation Envoyé par SheikYerbouti Voir le message
    Le problème, c'est le temps d'affichage. Il ne faut pas que l'utilisateur attende 2 minutes que la LOV s'affiche avec ses centaine de milliers de lignes...
    En appliquant l'idée de gifffftane, tu peux faire en sorte que le temps d'attente est absent. Il suffit pour cela de laisser la JTable appeler les données à afficher à partir du modèle. Ensuite, dans le modèle, d'est à toi de faire un préchargement de N lignes avant et N lignes après celles en cours d'affichage.
    Tu gères donc un cache à partir de ton modèle qui est purger régulièrement au fur et à mesure du scrolling de l'utilisateur.
    Evidemment, si l'utilisateur scroll trop vite, il y aura un temps d'attente car le modèle n'aura pas eu le temps de précharger les données. C'est à toi de faire des tests pour spécifier la taille du "cache".
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  10. #10
    Membre très actif
    Avatar de william44290
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Juin 2009
    Messages
    400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 400
    Par défaut
    En principe le AbstractTableModel ne fait rien c'est un simple connecteur qui assure la liaison entre Ton modele de donnée et ton controleur JTable

    Pour exemple le AbstractTableModel que j'utilise pour mes tables paginées
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
     
    package wListe;
     
    import javax.swing.table.AbstractTableModel;
     
    import wOutils.Sql;
     
    public class ListeModele extends AbstractTableModel  {
    	private static final long serialVersionUID = 1L;
     
    	Sql sql;
     
    	public ListeModele(Sql sql ) {
    		this.sql=sql;
    	}
    	public int getColumnCount() {
    		return sql.fields.size();
    	}
    	public Object getValueAt(int row, int col) {
    		return sql.data.get(row)[col];
    	}
    	public int getRowCount() {
    		return sql.data.size();
    	}
    	public String getColumnName(int col){
    		return sql.fields.get(col).t_lib;
    	}
    	public boolean isCellEditable(int row, int col) {
    		boolean ret=false;
    		if (((AbstractDbListe)sql.taThis).lce.isFastEdit(col)){
    			ret=true;
    		}
    		return ret;
    	}
    	public void setValueAt(Object obj, int row, int col){
    		sql.data.get(row)[col]=(String) obj;
    		fireTableDataChanged();
    	}
    }

  11. #11
    Membre Expert
    Avatar de gifffftane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 354
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 2 354
    Par défaut
    Oui, enfin c'est pas mon idée c'est comme ça que ça fonctionne, et si le problème est le temps d'affichage de centaines de milliers de lignes, je me demande quelle est la taille de l'écran ??

    Sur mon écran à moi (un écran normal chez un mec normal), une JTable affiche à tout casser 50 lignes. Donc elle demande à son modèle 50 lignes, 51 si jamais il y en a une qui déborde moitié, et ce quelque soit la taille de la base de données qu'il y a derrière, et quelque soit le nombre de lignes total de la JTable.

    Après, si le modèle est écrit pour charger 100.000 lignes alors qu'on ne lui en demande que 50...

  12. #12
    Membre très actif
    Avatar de william44290
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Juin 2009
    Messages
    400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 400
    Par défaut
    bah je crois que l'on se comprends pas. Sur la notion de modele.

    l'implémentation classique d'un jtable est régulièrement présentée avec des petites tables gérées par le biais d'un jscrollpane. Effectivement il n'y a rien de particulier à gérer.

    Dans le cadre de table avec des centaines de milliers d'enregistrements les temps de réponse, la gestion d'ascenseur, les filtres, les jointures et les orders posent une problématique rarement exposée et une stratégie de pagination s'impose.

    je n'ai pas trouvé de pattern particulier pour traiter ce problème.
    j'ai donc du créer mon jtable spécifique. il me semble que c'est la réponse à la question posée.

  13. #13
    Membre Expert
    Avatar de gifffftane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 354
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 2 354
    Par défaut
    Oui, c'est vrai, je suis un peu excessif ; je ne suis pas opposé aux stratégies de pagination, elles permettent une meilleure fluidité ; par exemple, si on affiche les 50 premières lignes, on peut lire en base les 100 premières de façon à être prêt lorsque l'utilisateur va scroller sa JTable.

    Par contre il est inutile de lire tous les enregistrements d'un coup, ce que je voulais dire.

  14. #14
    Expert confirmé
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Par défaut
    Citation Envoyé par william44290 Voir le message
    bah je crois que l'on se comprends pas. Sur la notion de modele.

    l'implémentation classique d'un jtable est régulièrement présentée avec des petites tables gérées par le biais d'un jscrollpane. Effectivement il n'y a rien de particulier à gérer.

    Dans le cadre de table avec des centaines de milliers d'enregistrements les temps de réponse, la gestion d'ascenseur, les filtres, les jointures et les orders posent une problématique rarement exposée et une stratégie de pagination s'impose.

    je n'ai pas trouvé de pattern particulier pour traiter ce problème.
    j'ai donc du créer mon jtable spécifique. il me semble que c'est la réponse à la question posée.
    Effectivement, la problèmatique devient complexe dans la mesure ou la table peut être triée sur n'importe qu'elle colonne, et enfin, la pré-selection se fait via un TextField ou chaque lettre frappée restreint la sélection.
    Donc au chargement, si l'utilisateur entre "z", il faut aller rechercher en base la page qui contient la première lettre "z" dans la colonne de recherche...

    Merci à tous pour vos conseils. Je voudrais m'imprégner de la solution de william44290, mais je n'ais pas bien saisi, dans ton abstract modèle, ou/comment la pagination est gérée...

  15. #15
    Membre très actif
    Avatar de william44290
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Juin 2009
    Messages
    400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 400
    Par défaut
    Bonjour SheikYerbouti, il à été écrit que c'est le modele qui devait gérer la pagination j'ai posté mon abstractModel pour démontrer que cela n'était pas exact.

    Le plus simple c'est que tu regarde mon appli tournée et que tu confirmes si c'est cela que tu veux réaliser. http://abcfamille.fr/ABCCoursePro.zip

    Comme ce code s'intègre dans un atelier logiciel il faudrait que je te détaille les concepts spécifique vs les concepts générique et le code que tu pourrais récupérer.


    http://www.developpez.net/forums/d76...s/#post4392271

    Pour extrait ceci est un panel/controleur de jtable
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    327
    328
    329
    330
    331
    332
    333
    334
    335
    336
    337
    338
    339
    340
    341
    342
    343
    344
    345
    346
    347
    348
    349
    350
    351
    352
    353
    354
    355
    356
    357
    358
    359
    360
    361
    362
    363
    364
    365
    366
    367
    368
    369
    370
    371
    372
    373
    374
    375
    376
    377
    378
    379
    380
    381
    382
    383
    384
    385
    386
    387
    388
    389
    390
    391
    392
    393
    394
    395
    396
    397
    398
    399
    400
    401
    402
    403
    404
    405
    406
    407
    408
    409
    410
    411
    412
    413
    414
    415
    416
    417
    418
    419
    420
    421
    422
    423
    424
    425
    426
    427
    428
    429
    430
    431
    432
    433
    434
    435
    436
    437
    438
    439
    440
    441
    442
    443
    444
    445
    446
    447
    448
    449
    450
    451
    452
    453
    454
    455
    456
    457
    458
    459
    460
    461
    462
    463
    464
    465
    466
    467
    468
    469
    470
    471
    472
    473
    474
    475
    476
    477
    478
    479
    480
    481
    482
    483
    484
    485
    486
    487
    488
    489
    490
    491
    492
    493
    494
    495
    496
    497
    498
    499
    500
    501
    502
    503
    504
    505
    506
    507
    508
    509
    510
    511
    512
    513
    514
    515
    516
    517
    518
    519
    520
    521
    522
    523
    524
    525
    526
    527
    528
    529
    530
    531
    532
    533
    534
    535
    536
    537
    538
    539
    540
    541
    542
    543
    544
    545
    546
    547
    548
    549
    550
    551
    552
    553
    554
    555
    556
    557
    558
    559
    560
    561
    562
    563
    564
    565
    566
    567
    568
    569
    570
    571
    572
    573
    574
    575
    576
    577
    578
    579
    580
    581
    582
    583
    584
    585
    586
    587
    588
    589
    590
    591
    592
    593
    594
    595
    596
    597
    598
    599
    600
    601
    602
    603
    604
    605
    606
    607
    608
    609
    610
    611
    612
    613
    614
    615
    616
    617
    618
    619
    620
    621
    622
    623
    624
    625
    626
    627
    628
    629
    630
    631
    632
    633
    634
    635
    636
    637
    638
    639
    640
    641
    642
    643
    644
    645
    646
    647
    648
    649
    650
    651
    652
    653
    654
    655
    656
    657
    658
    659
    660
    661
    662
    663
    664
    665
    666
    667
    668
    669
    670
    671
    672
    673
    674
    675
    676
    677
    678
    679
    680
    681
    682
    683
    684
    685
    686
    687
    688
    689
    690
    691
    692
    693
    694
    695
    696
    697
    698
    699
    700
    701
    702
    703
    704
    705
    706
    707
    708
    709
    710
    711
    712
    713
    714
    715
    716
    717
    718
    719
    720
    721
    722
    723
    724
    725
    726
    727
    728
    729
    730
    731
    732
    733
    734
    735
    736
    737
    738
    739
    740
    741
    742
    743
    744
    745
    746
    747
    748
    749
    750
    751
    752
    753
    754
    755
    756
    757
    758
    759
    760
    761
    762
    763
    764
    765
    766
    767
    768
    769
    770
    771
    772
    773
    774
    775
    776
    777
    778
    779
    780
    781
    782
    783
    784
    785
    786
    787
    788
    789
     
     
    package wListe;
     
    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.event.KeyEvent;
    import java.awt.event.KeyListener;
    import java.awt.event.MouseEvent;
    import java.awt.event.MouseListener;
    import java.awt.event.MouseWheelEvent;
    import java.awt.event.MouseWheelListener;
    import java.beans.PropertyChangeEvent;
    import java.beans.PropertyChangeListener;
    import javax.swing.BorderFactory;
    import javax.swing.JComponent;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.JScrollBar;
    import javax.swing.JTable;
    import javax.swing.SwingUtilities;
    import javax.swing.border.TitledBorder;
    import javax.swing.event.CaretEvent;
    import javax.swing.event.CaretListener;
    import javax.swing.table.TableColumn;
    import javax.swing.text.Document;
    import javax.swing.text.JTextComponent;
     
    import wComposant.JPopup;
    import wComposant.JSb;
    import wComposant.JTableDb;
    import wCtf.Ctf;
    import wFichier.FichierIAcces;
    import wFichier.AbstractFichier;
    import wFichier.FichierIMoveListener;
    import wOutils.Gp;
    import wOutils.Sql;
     
    public abstract class AbstractDbListe extends JPanel implements CaretListener, FichierIMoveListener,KeyListener, MouseWheelListener, MouseListener,FichierIAcces, PropertyChangeListener, ListeIPlus {
    	private static final long serialVersionUID = 1L;
    	public Sql sql=null;
    	public AbstractFichier fichier=null;
    	// Acces  VarModele
    	public JTableDb jt=null;
    	public ListeModele lm;
    	ListeSelectionListener lsl=null;
    	public ListeCellEditor lce=null;
    	HeaderCellRenderer hcr=null;
    	ListeCellRenderer lcr=null;
    	public ListeButtonPlus jpPlus=null;
    	public JLabel jDebug=null;
    	public JPanel jpEntete=null;
    	public JPanel jpDetail=null;
    	public ListeButtonTools jpListeTools=null;
    	JPanel jpJTable=null;
    	public JPanel jpListe=null;
    	public JSb sb=null;
    	public JSb sbTable=null;
    	boolean isEnable=true;
    	Color colorSelectedRowBackground=null;
    	Color colorSelectedRowForeground=null;
    	int colSelected=-1;
    	boolean pageprecedente=true;
    	boolean pagesuivante=true;
    	boolean precedent=true;
    	boolean suivant=true;
    	public AbstractDbListe(Sql sqlListe) {
    		this.sql=sqlListe;
    		initGlobal(); // Valorise les parametres globaux
    		initComponent();
    	}
    	private void initGlobal() {
    		if (sql.t_nbLigne==0)
    			sql.t_nbLigne=4;
    		sql.taThis=this;
    		sql.v_index="";
    		sql.initFields();
    		sql.initData();
    		sql.v_index=sql.t_seek;
    	}
    	public void initComponent() {
    		jpListe=new JPanel(new BorderLayout(0,0));{
    			jt = new JTableDb();{
    				adapteTable(jt);
    				this.colorSelectedRowBackground=jt.getSelectionBackground();
    				this.colorSelectedRowForeground=jt.getSelectionForeground();
    			}
    			jpJTable=new JPanel(new BorderLayout(0,0));{
    				jpEntete=new JPanel(new BorderLayout(0,0));{
    					jpEntete.setFocusable(false);
    					jpEntete.add(jt.getTableHeader(),BorderLayout.CENTER);
     
    					jpPlus= new ListeButtonPlus(this,true);{
    						jpPlus.setPreferredSize(new Dimension(jt.getTableHeader().getPreferredSize().height+4,jt.getTableHeader().getPreferredSize().height+4));
    						jpEntete.add(jpPlus,BorderLayout.EAST);
    					}
    				}
    				jpDetail=new JPanel(new BorderLayout(0,0));{
    					sb=new JSb(this,JScrollBar.VERTICAL);{
    						sb.setPlayButton();
    						sb.setHeight((sql.t_nbLigne)*Gp.HEIGHTCHAR*sql.t_height);
    					}
    					sbTable=new JSb(JScrollBar.VERTICAL);{ 
    						sbTable.setHeight((sql.t_nbLigne)*Gp.HEIGHTCHAR*sql.t_height);
    						sbTable.setWidth(-4);
    					}
    					jpDetail.add(sbTable,BorderLayout.WEST);
    					jpDetail.add(jt,BorderLayout.CENTER);
    					jpDetail.add(sb,BorderLayout.EAST);
    				}
    				jpJTable.add(jpEntete,BorderLayout.NORTH);
    				jpJTable.add(jpDetail,BorderLayout.CENTER);
    				jpJTable.setBorder(BorderFactory.createEtchedBorder());
     
    			}
    			jpListeTools =new  ListeButtonTools(this);{
    				jpListeTools.setVisible(false);
    			}
    			jpListe.add(jpJTable,BorderLayout.CENTER);
    			jpListe.add(jpListeTools,BorderLayout.SOUTH);
    		}
    		this.setLayout(new BorderLayout(0,0));{
    			this.add(jpListe,BorderLayout.WEST);
    		}
    		this.addMouseListener(this); // Pour le popup
    	}
    	public void userPlus(){
    		if (sql.debugF2){
    			jDebug=new JLabel();{
    				this.add(jDebug,BorderLayout.SOUTH);
    				String debug="";
    				if (sql.t_index!=null){
    					debug=debug+" t_index : ";
    					for (int i=0;i<sql.t_index.length;i++)
    						debug=debug+"!"+sql.t_index[i];
    					debug=debug+"!";
    				}
    				if (sql.v_index!=null)
    					debug=debug+" v_index : !"+sql.v_index+"!";
    				if (sql.v_filtre!=null){	
    					debug=debug+" v_filtre : ";
    					for (int i=0;i<sql.v_filtre.length;i++)
    						debug=debug+"!"+sql.v_filtre[i];
    					debug=debug+"!";
    				}
    				if (sql.clauseFilter!=null)
    					debug=debug+" clausfilter : !"+sql.clauseFilter+"!";
    				if (sql.clauseGroupBy!=null)
    					debug=debug+" clausgroup : !"+sql.clauseGroupBy+"!";
    				jDebug.setText(debug);
    			}
    		}
    		jpListeTools.setVisible(!jpListeTools.isVisible());
    		if (sql.t_F2!=null)
    			sql.t_F2Popup.pack();
    	}
     
    	public void setTitleFiche(){
    		setBorder(new TitledBorder(null,"[ Fichier : "+ sql.t_table+" ]", TitledBorder.LEFT, TitledBorder.DEFAULT_POSITION)); 
    	}
    	private void adapteTable(JTable jt){
    		adapteColumn();
    		lsl=new ListeSelectionListener(sql,jt);{		
    			jt.getSelectionModel().addListSelectionListener(lsl);
    		}
    		jt.putClientProperty(Ctf.COLOR_TABLE_SELECTIONBACKGROUND,colorSelectedRowBackground);
    		jt.putClientProperty(Ctf.RELOADTWIN,"ok");
    		jt.putClientProperty(Ctf.CELLEDIT,"ok");
    		jt.putClientProperty(Ctf.COL_LISTESELECTION,"ok");
    		jt.putClientProperty(Ctf.COL_LISTECELLRENDERER,"ok");
    		jt.putClientProperty(Ctf.COL_LISTECELLEDITOR,"ok");
    		jt.addPropertyChangeListener(Ctf.RELOADTWIN, this);
    		jt.addPropertyChangeListener(Ctf.CELLEDIT, this);
    		jt.addPropertyChangeListener(Ctf.COL_LISTESELECTION, this);
    		jt.addPropertyChangeListener(Ctf.COL_LISTECELLRENDERER, this);
    		jt.addPropertyChangeListener(Ctf.COL_LISTECELLEDITOR, this);
    		jt.setRowSelectionAllowed(true);
    		jt.setColumnSelectionAllowed(false);
    		jt.addKeyListener(this);
    		jt.addMouseWheelListener(this);
    		jt.addMouseListener(this);
    		jt.requestFocusInWindow();
    		jt.setFocusable(true);
    		jt.requestFocus(true);
    	}
    	private void adapteColumn(){
    		lm = new ListeModele(sql);{
    			jt.setModel(lm);
    		}
    		for (int field=0;field<sql.fields.size();field++)
    			if(sql.fields.get(field).t_libLength<sql.fields.get(field).t_lib.length())
    				sql.fields.get(field).t_libLength=sql.fields.get(field).t_lib.length();
     
    		lcr=new ListeCellRenderer(sql); {
    			int nbCol=jt.getModel().getColumnCount();
    			for (int i=0;i<nbCol;i++){
    				if (sql.fields.get(i).t_libLength>0){
    					jt.getColumnModel().getColumn(i).setCellRenderer(lcr);
    				}
    			}
    		}
    		lce=new ListeCellEditor(sql); {
    			int nbCol=jt.getModel().getColumnCount();
    			for (int i=0;i<nbCol;i++){
    				if (sql.fields.get(i).t_libLength>0){
    					jt.getColumnModel().getColumn(i).setCellEditor(lce);
    				}
    			}
    		}
     
    		hcr=new HeaderCellRenderer(sql);{
    			jt.getTableHeader().setDefaultRenderer(hcr);
    			int nbCol=jt.getTableHeader().getColumnModel().getColumnCount();
    			for (int i=0;i<nbCol;i++){
    				if (sql.fields.get(i).t_libLength>0){
    					TableColumn column=jt.getTableHeader().getColumnModel().getColumn(i);
    					if (sql.fields.get(i).t_libType!=Ctf.t_INVISIBLE){
    						column.setMinWidth(((sql.fields.get(i).t_libLength+2)*(Gp.WIDTHCHAR+0))+2);
    						column.setMaxWidth(((sql.fields.get(i).t_libLength+2)*(Gp.WIDTHCHAR+0))+2);
    					} else {	
    						column.setMinWidth(0);
    						column.setMaxWidth(0);
    					}
    				}
    			}
    		}
    		jt.getTableHeader().setFocusable(false);
    		jt.getTableHeader().setReorderingAllowed(false);
    		jt.getTableHeader().setOpaque(true);
    		jt.getTableHeader().setResizingAllowed(false);
    		jt.getTableHeader().setCursor(null);
    		jt.getTableHeader().setAutoscrolls(true);
    		jt.getTableHeader().setRequestFocusEnabled(false);
    		jt.getTableHeader().setBorder(null);
     
    		jt.setRowHeight(sql.t_height*jt.getRowHeight());
    	}
    	public void setHeaderSouth() {
    		hcr.jl.setBackground(Gp.MOVE_BG_LVERT);
    		hcr.jl.setBorder(BorderFactory.createLineBorder(Gp.LABEL_BORDER));
    		jpJTable.add(jpEntete,BorderLayout.SOUTH);
    	}
    	public void addFastEditListe(JComponent jc) {
    		lcr.addFastEdit(jc);
    		lce.addFastEdit(jc);
    	}
     
    	public void setEnabled(boolean enable){
    		if (enable) {
    			jt.setSelectionBackground(colorSelectedRowBackground);
    			jt.setSelectionForeground(colorSelectedRowForeground);
    			jt.setForeground(Gp.LABEL_FG_BLACK);
    		} else {
    			jt.setSelectionBackground(Gp.FILIGRANE_LGRAY);
    			jt.setSelectionForeground(Gp.VERTFONCE_FG);
    			jt.setForeground(Gp.FILIGRANE_LGRAY);
    		}
    		super.setEnabled(enable);
    		isEnable=enable;
    		sb.setEnabled(enable);
    		jpListeTools.setEnabled(enable);
    		jpPlus.setEnabled(enable);
    		jt.setEnabled(enable);
    		if (fichier.jbImprimer!=null)
    			fichier.jbImprimer.setEnabled(enable);
    		if (fichier.jbF3!=null)
    			fichier.jbF3.setEnabled(enable);
    	}
    	public void setVisible(boolean enable){
    		super.setVisible(enable);
    	}
    	public boolean isEnable(){
    		return isEnable;
    	}
    	private void setDebutFin(){
    		String sauve_index=sql.v_index;
    		// valorise t_debut/t_fin
    		sql.t_F2Fin="";
    		goBottomDb();
    		sql.t_F2Debut="";
    		goTopDb();
    		sql.v_index=sauve_index;
    	}
    	private void loadDb() {
    		sql.dBRead();
    		if (lm!=null){
    			colSelected=jt.getSelectedColumn();
    			lsl.UserAction=false;
    			lm.fireTableDataChanged();
    			lsl.UserAction=true;
    			lsl.selectRow(colSelected);
    		}
    	}
     
    	public void incrListe(){
    		if ((sql.t_nbLigne*sql.t_height)+sql.t_height<40)
    			sql.t_nbLigne=sql.t_nbLigne+sql.t_height;
    		resizeListe();
    	}
    	public void decrListe(){
    		if ((sql.t_nbLigne*sql.t_height)-sql.t_height>6)
    			sql.t_nbLigne=sql.t_nbLigne-sql.t_height;
    		resizeListe();
    	}
    	public void minListe(){
    		sql.t_nbLigne=6/sql.t_height;
    		resizeListe();
    	}
    	public void maxListe(){
    		sql.t_nbLigne=40/sql.t_height;
    		resizeListe();
    	}
    	private void resizeListe(){
    		sb.setHeight((sql.t_nbLigne)*Gp.HEIGHTCHAR*sql.t_height);
    		sbTable.setHeight((sql.t_nbLigne)*Gp.HEIGHTCHAR*sql.t_height);
    		this.validate();
    		load(Sql.t_LoadAllField);
    		if (sql.t_F2!=null){
    			sql.t_F2Popup.pack();
    		}
    	}
     
    	private void like(){
    		sql.rSSeekByLike();
    		loadDb();
    		sql.v_indexEqualData(0);
    		lsl.selectRow(colSelected);
    	}
    	// BRANCHEMENT DES BOUTONS
    	private void goPagenext() {
    		if (jt.getSelectedRow()>=0){
    			// Trouve le dernier index de la liste
    			sql.v_index="";
    			for (int index=0;index<sql.t_index.length;index++){
    				sql.v_index=sql.v_index+(String) sql.data.get(lm.getRowCount()-1)[sql.t_indexOrder[index]] ;
    			}
    			// Ne change de page que si on est pas sur la dernière page
    			if (!sql.v_index.equals(sql.t_F2Fin)){
    				sql.dBNextPageByIndex();
    				load(Sql.t_LoadAllField);
    				//Gp.afficherTrace(2,sql.t_Recno);
    				loadTwin(Sql.t_LoadAllField);
    			} else {
    				if (jt.getSelectedRow()!=lm.getRowCount()-1){
    					sql.dBBottomByIndex();
    					load(Sql.t_LoadAllField);
    					//Gp.afficherTrace(2,sql.t_Recno);
    					loadTwin(Sql.t_LoadAllField);
    				}
    			}
    		}
    	}
     
    	private void goPageup() {
    		if (jt.getSelectedRow()>=0){
    			// Trouve le premier index de la liste
    			sql.v_index="";
    			for (int index=0;index<sql.t_index.length;index++){
    				sql.v_index=sql.v_index+(String) sql.data.get(0)[sql.t_indexOrder[index]] ;
    			}
    		}
    		//System.out.println(" goPageup "+sql.v_filtre);
    		sql.dBUpPageByIndex();
    		load(Sql.t_LoadAllField);
    		loadTwin(Sql.t_LoadAllField);
    	}
     
    	private void goBottom() {
    		goBottomDb();
    		load(Sql.t_LoadAllField);
    		loadTwin(Sql.t_LoadAllField);
    	}
    	private void goBottomDb(){
    		sql.dBBottomByIndex();
    	}
     
    	public void goTop() {
    		goTopDb();
    		load(Sql.t_LoadAllField);
    		loadTwin(Sql.t_LoadAllField);
    	}
    	private void goTopDb(){
    		sql.dBTopByIndex();
    	}
    	/*/////////////////////////
    	// INTERFACE UTILISATEUR //
    	/////////////////////////*/
    	public void setScroolBarPos(){
    		if (sql.v_index.equals(sql.t_F2Debut))
    			sb.setValue(JSb.MIN);
    		else
    			if (sql.v_index.equals(sql.t_F2Fin))
    				sb.setValue(JSb.MAX);
    			else
    				sb.setValue(JSb.MIL);
    	}
    	public void keyTyped(KeyEvent arg0) {}
    	public void keyReleased(KeyEvent arg0) {}
    	public void keyPressed(KeyEvent arg0) {
    		if (jt.isEnabled()){
    			if (arg0.isControlDown()){
    				switch (arg0.getKeyCode()) {
    				case KeyEvent.VK_M: focusOnTwin();arg0.consume(); break;
    				default:
    					break; }
    			} else {
    				switch (arg0.getKeyCode()) {
    				case KeyEvent.VK_F1:
    					jpListeTools.jlAide.setVisible(!jpListeTools.jlAide.isVisible());
    					if (!jpListeTools.isVisible())
    						userPlus();
    					arg0.consume();
    					break;
    				case KeyEvent.VK_ENTER: 	exitAndReturnSel(null);arg0.consume(); break;
    				case KeyEvent.VK_F2: 		exitAndReturnSel(null);arg0.consume(); break;
    				case KeyEvent.VK_ESCAPE: 	exitAndAbortSel();arg0.consume(); break;
    				case KeyEvent.VK_F3: 		fichier.userF2F3();arg0.consume(); break;
    				case KeyEvent.VK_F5: 		fichier.userF5Print();arg0.consume(); break;
    				case KeyEvent.VK_UP: 		precedent() ; arg0.consume(); break;
    				case KeyEvent.VK_DOWN: 		suivant() ; arg0.consume(); break;
    				case KeyEvent.VK_SPACE: 	suivant() ; arg0.consume(); break;
    				case KeyEvent.VK_PAGE_UP: 	pagePrecedente();arg0.consume(); break;
    				case KeyEvent.VK_PAGE_DOWN: pageSuivante();arg0.consume(); break;
    				case KeyEvent.VK_END: 		fin();arg0.consume(); break;
    				case KeyEvent.VK_INSERT: 	incrListe();arg0.consume(); break;
    				case KeyEvent.VK_DELETE: 	decrListe();arg0.consume(); break;
    				case KeyEvent.VK_HOME: 		debut();arg0.consume(); break;
    				default:
    					switch (arg0.getKeyChar()) {
    					case '+':
    						if (!jpListeTools.isVisible()){
    							userPlus();
    							arg0.consume();
    						}
    						break;
    					case '-':
    						if (jpListeTools.isVisible()){
    							userPlus();
    							arg0.consume();
    						}
    						break;
    					}
    				break; }
    			}
    		}
    	}
    	public void propertyChange(PropertyChangeEvent arg0) {
    		if (arg0.getPropertyName().equals(Ctf.RELOADTWIN)){
    			lce.cancelCellEditing();
    			userUpdateTextField(null);
    			selectionChanged(colSelected);
    		}
    		if (arg0.getPropertyName().equals(Ctf.COL_LISTESELECTION)){
    			lce.cancelCellEditing();
    			colSelected=lsl.colHasSelection;
    			lsl.UserAction=false;
    			selectionChanged(colSelected);
    			lsl.UserAction=true;
    		}
    		if (arg0.getPropertyName().equals(Ctf.COL_LISTECELLRENDERER)){ 
    			lce.cancelCellEditing();
    			colSelected=lcr.colHasFocus;
    		}
    		if (arg0.getPropertyName().equals(Ctf.COL_LISTECELLEDITOR)){
    			lce.cancelCellEditing();
    			colSelected=lce.colHasEdit;
    		}
    		if (arg0.getPropertyName().equals(Ctf.CELLEDIT)){ 
    			colSelected=lce.colHasEdit;
    			String nameField=lce.getName(colSelected);
    			fichier.userEnterLigne(nameField,jt.getValueAt(jt.getSelectedRow(),colSelected));
    		}
    	}
    	public void exitAndReturnSel(String nameField){
    		if (sql.t_F2==null) { // c'est une liste à l'ecran
    			if (fichier!=null){ //et une Liste twin d'une fiche
    				if (jt.getSelectedRow()>=0){
    					nameField=lce.getName(lce.colHasEdit);  
    					if (nameField==null){ // pas de cellule en édition donc enter sur la ligne
    						if (lcr.isFastEdit(lcr.colHasFocus)){ // Enter sur une cellule fastedit
    							nameField=lcr.CellHasFocus;
    						}
    					}
    				}
    				// la cellule est Fastedit
    				if (nameField!=null){ // Edite la cellule
    					if(lce.isInEdit()){
    						lce.cancelCellEditing();
    					} else {
    						jt.editCellAt(jt.getSelectedRow(),jt.getSelectedColumn());
    						//jt.getEditorComponent().requestFocusInWindow();
    					}
    				} else { // Valid la ligne
    					fichier.userEnterLigne(null,null);
    				}
    			}
    		} else {  // c'est une liste d'un F2
    			//exitAndAbortSel();
    			sql.t_Recno="";
    			if (jt.getSelectedRow()>=0)
    				sql.t_Recno=(String) sql.data.get(jt.getSelectedRow())[sql.t_recnoCol];
    			//sql.t_F2.setText(sql.v_index);
    			this.fichier.putClientProperty(JPopup.T_RETURN,sql.v_index);
    		}
    	}
    	public void exitAndAbortSel(){
    		if (sql.t_F2==null){
    			if (fichier!=null){
    				fichier.userEscBascule();
    			} 
    		} else {
    			//sql.t_F2.popupClose();
    			this.fichier.putClientProperty(JPopup.ESCAPE, "ok");
    		}
    	}
     
     
    	private void selectionChanged(int col){
    		if (lsl.rowHasSelection>=0){
    			jt.setRowSelectionInterval(lsl.rowHasSelection,lsl.rowHasSelection);
    			jt.changeSelection(lsl.rowHasSelection,col, false, false);
    		}
    		setScroolBarPos();
    	}
    	public void focusOnTwin() {
    		if (sql.taTwin!=null)
    			if (((JPanel)sql.taTwin).isVisible())
    				sql.taTwin.requestFocusThis();
    	}
    	public void mouseWheelMoved(MouseWheelEvent arg0) {
    		if (jt.isEnabled())
    			if (arg0.getWheelRotation()>0){
    				suivant();
    			} else { 
    				precedent(); }
    	}
     
    	public void mouseEntered(MouseEvent arg0) {}
    	public void mouseExited(MouseEvent arg0) {}
    	public void mousePressed(MouseEvent arg0) {}
    	public void mouseReleased(MouseEvent arg0) {}
    	public void mouseClicked(MouseEvent arg0) {
    		if ( SwingUtilities.isLeftMouseButton(arg0) ) 
    			if (jt.isEnabled())
    				if (arg0.getClickCount()==2){
    					//int column=jt.columnAtPoint(arg0.getPoint());
    					//if (lcr.isFastEdit(column)){
    					//exitAndReturnSel(sql.fields.get(column).t_field);
    					//} else {
    					exitAndReturnSel(null);
    					//}
    				}
    	}
    	public void debut() {
    		if (lsl.isMovable()){
    			goTop();
    			setScroolBarPos();
    		}
    	}
    	public void fin() {
    		if (lsl.isMovable()){
    			goBottom();
    			setScroolBarPos();
    		}
    	}
    	public void pagePrecedente() {
    		if (pageprecedente){
    			pageprecedente=false;
    			if (lsl.isMovable()){
    				if (!sql.v_index.equals(sql.t_F2Debut)) {
    					goPageup();
    				}
    				setScroolBarPos();
    			}
    			pageprecedente=true;
    		}
    	}
    	public void pageSuivante() {
    		if (pagesuivante){
    			pagesuivante=false;
    			if (lsl.isMovable()){
    				if (!sql.v_index.equals(sql.t_F2Fin)){
    					goPagenext();
    				}
    				setScroolBarPos();
    			}
    			pagesuivante=true;
    		}
    	}
    	public void precedent() {
    		if (precedent){
    			precedent=false;
    			if (lsl.isMovable()){
    				if (!sql.v_index.equals(sql.t_F2Debut)){
    					int selected=jt.getSelectedRow();
    					if (selected-1>=0)
    						jt.setRowSelectionInterval(selected-1,selected-1);
    					else {
    						pagePrecedente();
    						if (jt.getRowCount()>0)
    							jt.setRowSelectionInterval(jt.getRowCount()-1,jt.getRowCount()-1);
    					}
    				}
    				setScroolBarPos();
    			}
    			precedent=true;
    		}
    	}
    	public void suivant() {
    		if (suivant){
    			suivant=false;
    			if (lsl.isMovable()){
    				if (!sql.v_index.equals(sql.t_F2Fin)){
    					int selected=jt.getSelectedRow();
    					if (selected+1<=jt.getRowCount()-1)
    						jt.setRowSelectionInterval(selected+1,selected+1);
    					else 
    						pageSuivante();
    				}
    				setScroolBarPos();
    			}
    			suivant=true;
    		}
    	}
    	/*////////////////////////////////////
    	// LIASON UTILISATEUR AUTRE FENETRE //
    	////////////////////////////////////*/
    	public void requestFocusThis() {
    		jt.requestFocus();
     
    		//boolean tabGetFocus=true;
    		//if (lcr.size()!=0)
    		//	tabGetFocus=false;
    		//if (tabGetFocus)// Force le focus a aller dans la liste
    		//	try {
    		//		Robot robot=new Robot();
    		//		robot.keyPress(KeyEvent.VK_TAB);
    		//	} catch (AWTException e) { e.printStackTrace(); }
    	}
    	public void setResizeCol(int numCol){
    		if (numCol>-1){
    			TableColumn tc=jt.getTableHeader().getColumnModel().getColumn(numCol);
     
    			int pixlenField=((sql.fields.get(numCol).t_fieldLength+2+5)*Gp.WIDTHCHAR);
    			int pixlenLibe=tc.getMaxWidth();
    			if (pixlenField>pixlenLibe){
    				int newWidth=((sql.fields.get(numCol).t_libLength+2+3)*(Gp.WIDTHCHAR+0))+2;
    				tc.setMinWidth(newWidth);
    				tc.setMaxWidth(newWidth);
    				tc.setPreferredWidth(newWidth);
    			}
    		}
    	}
     
    	public void caretUpdate(CaretEvent e) {
    		if (lsl.isMovable()){
    			sql.v_index=((JTextComponent)e.getSource()).getText().trim();
    			like();
    			loadTwin(Sql.t_LoadAllField);
    		}
    	}
    	public void loadTwin(int load){
    		if (sql.taTwin!=null){
    			if (load==Sql.t_LoadAllField){
    				// Mise à Jour de la  fiche
    				// revalorise t_varia avec le t_varia de la nouvelle selection de la liste
    				//System.out.println("DbListe loadtwin "+sql.v_index); 
    				sql.sqlTwin.v_index=sql.v_index;
    				sql.taTwin.load(Sql.t_LoadAllField);
    			}
    		} 
    	}
    	public void loadTwin(String recno){
    		if (sql.taTwin!=null){
    			sql.taTwin.goRecno(recno);
    			sql.taTwin.load(Sql.t_LoadAllField);
    		} 
    /*		else {
    			if (sql.t_table.equals("ingredient"));
    			Gp.afficherTrace(1,recno);
    		}*/
    	}
    	public void goRecno(String recno){
    		sql.dBGoRecnoByRecno(recno);
    	}
    	/*///////////////////////////
    	// INTERFACE AUTRE FENETRE //
    	///////////////////////////*/
    	public void validateDebut(){
    		load(Sql.t_F2DebutFin);
    		load(Sql.t_LoadAllField);
     
    		// Retire la zone de rechecherche si le nombre d'enregistrement
    		// est inférieur au nombre de ligne de la liste
    		// Valable pour la liste et le F2
    		if (!sql.t_showSearch)
    			if (jpListeTools.isVisible())
    				userPlus();
    	}
    	public void load(String v_index) {
    		sql.v_index=v_index;
    		load(Sql.t_LoadAllField);
    	}
    	public void load(int load) {
    		switch (load){
    		case Sql.t_LoadRowid:
    			int row=lsl.rowHasSelection;
    			if (row>=0){
    				colSelected=jt.getSelectedColumn();
    				sql.rSSoftSeek();
    				sql.dBReadRecno(row);
    				for (int field=0;field<sql.data.get(row).length-2;field++)
    					jt.setValueAt((String) sql.data.get(row)[field], row,field );
    				jt.setRowSelectionInterval(row,row);
    				jt.changeSelection(row,colSelected, false, false);
    			}
    			break;
    		case Sql.t_LoadAllField:
    			if (sql.v_index.equals(Sql.t_bottom)){
    				sql.dBBottomByIndex();
    			} else {
    				if (sql.v_index.equals(Sql.t_top)) {
    					sql.dBTopByIndex();
    				} else {				
    					sql.rSSoftSeek();
    				}
    			}
    			if (sql.t_eof){		// CHARGE DEPUIS LE DEBUT DE FICHIER
    				// Trouve la ligne de la table egale au t_varia
    				sql.rSSoftSeek();
    				// charge la liste avec le reste de la table depuis cette nouvelle ligne
    				loadDb();
    				//valorise le t_varia sur la premiere ligne trouvée
    				sql.v_indexEqualData(0);
    				// la liste à été rechargée
    				// pose la selection et charge la ligne selectionner dans la fiche
    				lsl.selectRow(colSelected);
    				sql.t_seek=sql.v_index;
    			} else {			//CHARGE LA LISTE EN RECULANT D'UN CRAN 
    				//String v_index=sql.v_index;
    				sql.dBSkavantByIndexEof();
    				if (sql.t_eof){ // PAS DE PRECEDENT CHARGE DEPUIS LA FICHE
    					sql.dBSeekByIndex(sql.v_index);
    					// Trouve la ligne de la table egale au t_varia
    					sql.rSSoftSeek();
    					// charge la liste avec le reste de la table depuis cette nouvelle ligne
    					loadDb();
    					//valorise le t_varia sur la premiere ligne trouvée
    					sql.v_indexEqualData(0);
    					// la liste à été rechargée
    					// pose la selection et charge la ligne selectionner dans la fiche
    					lsl.selectRow(colSelected);
    					sql.t_seek=sql.v_index;
     
    				} else { 		// UN PRECEDENT CHARGE DEPUIS LE PRECEDENT LA BONNE FICHE SE TROUVE EN NUMERO2
    					// Trouve la ligne de la table egale au t_varia
    					sql.dBGoRecnoByRecno(sql.t_Recno);
    					sql.rSSoftSeek();
    					// charge la liste avec le reste de la table depuis cette nouvelle ligne
    					loadDb();
    					//valorise le t_varia sur la premiere ligne trouvée
    					if (sql.data.size()>1) {// Plusieurs ligne dans la liste choisi la Deuxième comme référence
    						sql.v_indexEqualData(1);
    						sql.t_Recno=sql.data.get(1)[sql.t_recnoCol].toString();
    					} else	{				// Reste sur la seule ligne de laliste
    						sql.v_indexEqualData(0);
    					}
    					// la liste à été rechargée
    					// pose la selection et charge la ligne selectionner dans la fiche
    					lsl.selectRow(colSelected);
    					sql.t_seek=sql.v_index;
    				}
    			}
     
    			break;
    		case Sql.t_F2DebutFin: 
    			setDebutFin();
    			//System.out.println(sql.getQuerryFrom()+" debut : "+sql.t_F2Debut+" Fin "+sql.t_F2Fin+" index "+sql.v_index);
    			break;
    		}
    		setScroolBarPos();
    	}
    	public void userUpdateTextField(Document jdct) {
    		jdct=null;
    		//System.out.println("Liste selection change: "+sql.v_index);
    		loadTwin(Sql.t_LoadAllField);
    	}
    }

  16. #16
    Expert confirmé
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Par défaut
    Ok merci
    Je m'apprête à partir en congé, et me plongerai dans ceci au mois d'août.

Discussions similaires

  1. [SQL-Server] Gros volume d'informations
    Par berceker united dans le forum PHP & Base de données
    Réponses: 12
    Dernier message: 25/07/2006, 09h46
  2. Gérer le gros volume de données
    Par berceker united dans le forum Décisions SGBD
    Réponses: 2
    Dernier message: 21/07/2006, 19h29
  3. Comparaison de fichiers très gros volume
    Par tanys dans le forum Shell et commandes GNU
    Réponses: 3
    Dernier message: 27/06/2006, 23h58
  4. Optimisation MySQL pour gros volumes
    Par barns dans le forum Requêtes
    Réponses: 8
    Dernier message: 01/10/2005, 11h28
  5. [Gros volume] Optimisations ?
    Par Grubshka dans le forum PostgreSQL
    Réponses: 6
    Dernier message: 21/04/2005, 10h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo