Κυριακή, 14 Απριλίου 2019

1219. Η/Υ, dBase III Plus και Clipper


Έρχεται η στιγμή, ας πούμε μετά από τριάντα πέντε έτη εργασίας, να αδειάσεις το υπηρεσιακό σου γραφείο από τα προσωπικά σου αντικείμενα. Το πράττεις. Το μόνο σίγουρο, στην περίπτωση αυτή, ότι και θα βρεις και θα θυμηθείς. Μου συνέβη.

Βρήκα! Τρία πλαστικά ντοσιέ και τέσσερα χαρτιών σετ. Συνολικό πλήθος σελίδων: 304. Περιεχόμενο; Προγράμματα! Προγράμματα σε Clipper για εφαρμογές που, στα τέλη της δεκαετίας του 80 αρχές αυτής του 90, είχα φτιάξει για την υπηρεσία.

Προγράμματα με ονόματα όπως: C_PASS.PRG, EPP.PRG, EP_ETOYS.PRG, FUNCTION ANTIL (FRASH, ARADA, X_NUM), FUNCTION BALE() και άλλα τέτοια πολλά. Θυμήθηκα!

Ας το πιάσουμε από την αρχή. Καταφεύγω στο, ψηφιοποιημένο, χειρόγραφο ημερολόγιο μου. Ψάχνω τη λέξη «υπολογιστή». Πέρα από αυτόν που χρησιμοποίησα, στο ΕΜΠ, για την Διπλωματική μου εργασία, το 1979, βρίσκω το απόσπασμα που ακολουθεί:

. . . Σήμερα μάλιστα άρχισα να ασχολούμαι ενεργά με έναν PC υπολογιστή που διαθέτει ο ΑΗΣ (πακέτο dbase III plus κ.λ.π.).


Τότε, λοιπόν, ξεκίνησαν όλα. Θυμάμαι πόσο αγάπησα την συγκεκριμένη ενασχόληση. Τα απογεύματα που, αμισθί, παρέμενα στο γραφείο για να διαβάσω και να μάθω το άγιο DOS. Τότε που για να χρησιμοποιήσεις τον Η/Υ έπρεπε να πληκτρολογείς υπαρκτές εντολές και όχι να κουνάς ένα ποντίκι και όπου σε βγάλει.

Θυμάμαι και μία περίπτωση που, βραδάκι, μπήκε στο γραφείο που διάβαζα μία νυχτερίδα! Είδα και έπαθα μέχρι να  καταφέρω να την βγάλω σώα έξω από το γραφείο.

Ασχολήθηκα, λοιπόν και κυρίως, με την dBase III Plus η οποία δεν ήταν παρά ένα σύστημα διαχείρισης βάσεων δεδομένων για τα, τότε, λειτουργικά συστήματα CP/M και DOS. Αγόρασα, μάλιστα, και το βιβλίο: «Εισαγωγή και Προγραμματισμός με την dBASE» του Κ. Καραΐσκου, έκδοση «Α. Παπασωτηρίου», στις 27/11/87 (αμ’ έπος αμ’ έργον) με κόστος 4,69 €. Ένα βιβλίο το οποίο, προφανώς, με βοήθησε και από την άλλη με εξόργισε με τα αισχρά Ελληνικά του! Το ωραίο είναι ότι, για την συγκεκριμένη έκδοση, υπήρχε και «επιμελητής»! Ατυχώς το βιβλίο αυτό δεν υπάρχει, πλέον, στην βιβλιοθήκη μου. Ας όψεται το «Project Δήμητρα»!



Το ένα φέρνει το άλλο. Από την dBase III Plus πέρασα στο Clipper της Nantucket. To Clipper ήταν μία γλώσσα προγραμματισμού που επέτρεπε την κατασκευή εφαρμογών διαχείρισης βάσεων δεδομένων που «έτρεχαν» σε περιβάλλον DOS. Σε Clipper, λοιπόν, είναι τα προγράμματα εκτυπώσεις των οποίων βρήκα αδειάζοντας, πώς να το πω;, το γραφείο μου.

Το αγάπησα το Clipper! Ξόδεψα δεκάδες ώρες μελετώντας το. Άρχισα, έτσι, να προγραμματίζω. Θυμάμαι ότι έγραφα τα προγράμματα μου στο σπίτι, στο οποίο δεν είχα, Η/Υ και είχα την αγωνία να πάω στο γραφείο να τα «τρέξω» και να δω αν και πώς λειτουργούν. Με μεθούσε ο προγραμματισμός! Μου έδινε υψηλή πνευματική απόλαυση. Το να ξεπερνάω προβλήματα, να εφευρίσκω λύσεις, να εμπλουτίζω τις εφαρμογές με νέες δυνατότητες ήταν το καλύτερό μου!

Δουλεύαμε με δισκέτες τότε. Αρχικά 5 ¼ και κατόπιν 3,5 ιντσών. Οι χωρητικότητες, με τα σημερινά μέτρα, κυριολεκτικά αστείες! Από   360 ΚΒ μέχρι 1,44 ΜΒ! Θυμάμαι, λοιπόν, ότι, μέχρι να αποκτήσουμε εκτυπωτή στη υπηρεσία, πήγαινα και εκτύπωνα τα προγράμματά μου σε μία Εταιρεία, με την οποία συνεργαζόμασταν, προκειμένου να μπορώ να τα μελετήσω/ βελτιστοποιήσω απόγευμα και βράδυ στο σπίτι. Τέτοιο πάθος!

Εξακολουθούσα να αγοράζω, προσωπικά ή / και υπηρεσιακά, σχετικά βιβλία κυρίως, πλέον, για το Clipper. Αγαπημένο βιβλίο το The Clipper Interface Handbookτου John Mueller (Windcrest / McGraw – Hill) το οποίο αγόρασα στις 26/5/1992 με κόστος 20,83 €. Ατυχώς, και πάλι, έπεσε και αυτό θύμα του «Project Δήμητρα».

Η πρώτη εφαρμογή που έφτιαξα ήταν, αν θυμάμαι καλά, σχετική με την αξιολόγηση μισθωτών. Μια εφαρμογή που έδινε τη δυνατότητα να αξιολογήσεις (βαθμολογήσεις) να κατατάξεις και να έχεις πρόσβαση σε ένα πλήθος στατιστικών στοιχείων. Ακολούθησαν, μεταξύ άλλων, μία εφαρμογή για την μισθοδοσία του εκτάκτου προσωπικού και μία για την σύνταξη του Ετήσιου Προϋπολογισμού. Αυτή η τελευταία θα πρέπει να ήταν από τις πρώτες, στην υπηρεσία, που προέκυπτε από προγραμματισμό με τους Πίνακες Προϋπολογισμού εκτυπωμένους, με dot matrix εκτυπωτή, και όχι δακτυλογραφημένους. Μια εφαρμογή για την οποία η δακτυλογράφος, που μέχρι τότε δακτυλογραφούσε, κυρίως υπερωριακά, τους σχετικούς Πίνακες μου έκοψε την «Καλημέρα»!

Ακολούθησαν εφαρμογές, όταν πια είχα μετατεθεί στην Αθήνα τον Σεπτέμβριο του 1993, για την καταχώριση και επεξεργασία υπηρεσιακών πληροφοριών για τους μισθωτούς, για την επίδοση «φύλλων επιστράτευσης», ανάλογα με τον συνδικαλιστικό φορέα των εργαζομένων και, κυρίως, την τήρηση Πρωτοκόλλου Εισερχομένων / Εξερχομένων εγγράφων στην κεντρική υπηρεσία. Η τελευταία αυτή εφαρμογή ήταν και η «βαρύτερη» που είχα φτιάξει και έλυσε αρκετά προβλήματα επί τριετία τουλάχιστον.

Είχε έλθει πλέον η εποχή του λειτουργικού συστήματος Windows, κυρίως η έκδοσή του 3.1 το 1992, και η Nantucket, η Εταιρεία που είχε κατασκευάσει και καθιερώσει το Clipper, δεν μπόρεσε να προσαρμοστεί στην «παραθυρική» εποχή. Έσβησε! Στην ουσία την ακολούθησα! Άλλαξε και το αντικείμενο εργασίας μου και παράτησα τον προγραμματισμό. Έμεινα το διάστημα 1987 – 1994 να μου θυμίζει την πνευματική χαρά και την ανάταση που μου είχε χαρίσει!

Έψαξα τον Η/Υ της Τ47 και, βεβαίως, είχα κρατήσει αντίγραφα από τα Προγράμματα αυτά. Αντίγραφα δισκετών και στο σύνολο τους. Αρχεία EXE, DBF, NTX, BAT. Όλα! Δεν επιθυμώ να επεκταθώ σε τεχνικές λεπτομέρειες που ούτε εγώ πλέον καλοθυμάμαι. Θα παραθέσω όμως, έτσι για να πάρετε μία γεύση, τον κώδικα μιας διαδικασίας (Procedure) και μίας συνάρτησης (Function). Ιδού:

**************************************************************

 PROCEDURE MY_DBU( nTop, nLeft, nBottom, nRight, aEPIKEF, aPEDIO, ;

                   aPERIOXH, nPEDIA, aPLATOS, aTEXT, MyPlik )
**************************************************************

*Περιγραφή -----> Συνάρτηση Εμφάνισης/Ενημέρωσης Αρχείου DBF

    LOCAL browse                        // Το αντικείμενο TBrowse
    LOCAL cColorSave, nCursSave         // "Φύλακες" Καταστάσεων
    LOCAL nKeY                          // Πληκτροπάτημα
    LOCAL lMore                         // Έλεγχος Βρόχου
    LOCAL Fouli                         // Για να κάνουμε, επιτέλους, την δουλειά μας
    LOCAL column                        // Aμ πώς θα την γαζώσουμε !
    LOCAL lSavReadExit := READEXIT( .T. )  // Ενεργοποίηση πλήκτρων Άνω/Κάτω
                                           // για Εξοδο από READ
    LOCAL SSS
    MEMVAR QUI, MyFunc2

       browse := TBrowseDB( nTop, nLeft, nBottom, nRight )

       FOR Fouli=1 TO nPEDIA
        column := TBColumnNew( aEPIKEF[fouli], ;
                  FieldWblock( aPEDIO[fouli], aPERIOXH[fouli] ) )
         column : width := aPLATOS[Fouli]
        browse : addColumn(column)
       NEXT

    TURN_OFF_APPEND_MODE(browse)

    browse:skipBlock := { |x| Skipper(x, browse) }

    browse:headSep := MY_HEADSEP
     browse:colSep := MY_COLSEP
    browse:footSep := MY_FOOTSEP

    FancyColors(browse)

     cColorSave := SetColor("N/W")

      ANTIL( PADC( aTEXT[1], T_STL+1 ), 0, 7, 7 )
      ANTIL( PADC( aTEXT[2], T_STL+1 ), T_GRM-1, 7, 7 )
      ANTIL( PADC( aTEXT[3], T_STL+1 ), T_GRM, 7, 7 )

     SetColor( "N/W" )

     DISPBOX( nTop-1, nLeft-2, nBottom, nRight+2, 2 ) // αντί nBottom + 1

     SetColor("W/W")
    @ nTop, nLeft-1 CLEAR TO nBottom-1, nRight+1 // αντί nBottom
     SetColor( "N/W" )
    @ nTop+1, nLeft-2   SAY CHR(204) + CHR(205) // Για να οι του έσω πλαισίου
    @ nTop+1, nRight+1  SAY CHR(205) + CHR(185) // γραμμές κλείνουν
     SetColor(cColorSave)

    nCursSave := SetCursor(SC_NONE)

    lMore := .T.

    DO WHILE lMore // Βρόχος Βασικός κι Ασήκωτος

      if ( Browse:colPos <= Browse:freeze )
           Browse:colPos := ( Browse:freeze + 1 )
      endif

       nKeY := 0

        DO WHILE nKeY == 0 .AND. .NOT. browse:stable
         browse:stabilize()
         nKeY := Hot_InKey()
        ENDDO

         * Αριθμός Εγγραφής / Σύνολο Εγγραφών
        @ nBottom, nRight-16 SAY "[ " + STR( RECNO(), 5 ) + ;
                                " / " + STR( LASTREC(), 5 ) + " ]" ;
                                 COLOR "N/W"

        IF DELETED()
         @ nTop-1, nRight-16 SAY "< Διεγράφη >"  ;
                             COLOR IF( QUI, "W+/R", "N/W" )
        ELSE
         @ nTop-1, nRight-16 SAY REPLICATE( CHR(205), 13 ) ;
                                 COLOR "N/W"
        ENDIF

        SSS := &MyFunc2

        IF browse:stable
         IF browse:hitBottom .AND. .NOT. IS_APPEND_MODE(browse)
          TURN_ON_APPEND_MODE( Browse )
          nKey := K_DOWN
         ELSE
          IF browse:hitTop .OR. browse:hitBottom
           TONOS( 125, 0 )
          ENDIF
           browse:refreshCurrent()
            ForceStable(browse)
            nKeY := HOT_INKEY(0)
         ENDIF
        ENDIF

        IF nKeY == K_ESC
         lMore := .F.
        ELSE
         MYAPPKEY(browse, nKeY, MyPlik )
        ENDIF

    ENDDO

    SETCURSOR(nCursSave)
    READEXIT( lSavReadExit )

    RETURN


*********************
 FUNCTION SEEK_AP()
*********************

 LOCAL REC, SCR, mAREGG
MEMVAR InOut

  REC := RECNO()
  DBSETORDER( 1 )

  SCR := SCRNSAVE( T_GRM-2, 0, T_GRM, T_STL )
      
  IF InOut < 3 
   mAREGG := DTOC(DATE())
  ELSE
   mAREGG := SPACE(2)   
  ENDIF
               
 XROMA(1)
 ANTIL( PADC( " ΠΛΗΚΤΡΟΛΟΓΕΙΣΤΕ " + ;
          IIF( InOut<3 o:p="">
          T_STL+1 ), T_GRM, 2, 2 ) 
       ANTIL( PADC( IIF( InOut<3 nbsp="" o:p="">
            "EΤΟΙΜΟΣ ! [  ]"), T_STL+1 ), T_GRM-1, 7, 7 )        
 CLEAR GETS
 SET CURSOR ON
        
        IF InOut < 3
          @ T_GRM-1, CENT(SPACE(20)) + 11 GET mAREGG ;
                  COLOR IF( QUI, "W+/BG", "N/W" ) PICTURE "99/99/99"
         ELSE             
          @ T_GRM-1, CENT(SPACE(14)) + 11 GET mAREGG ;
                  COLOR IF( QUI, "W+/BG", "N/W" ) PICTURE "99"  
         ENDIF
        
        READ
         SET CURSOR OFF

         SET SOFTSEEK ON
       IF InOut < 3
         SEEK DTOS(CTOD(mAREGG))
       ELSE
         SEEK SPACE( 2 -LEN(ALLTRIM(mAREGG)))+ALLTRIM(mAREGG)
       ENDIF
          SET SOFTSEEK OFF
        
        IF EOF() // Αλλως ! FOUND() διότι βεβαίως έχουμε και το SOFTSEEK ON !
        IF InOut < 3
         ANTIL( PADC( "ΔΕΝ ΥΠΑΡΧΕΙ ΕΙΣΕΡΧΟΜΕΝΟ ΜΕ ΗΜΕΡΟΜΗΝΙΑ ΠΑΡΑΛΑΒΗΣ " + ;
               mAREGG, T_STL+1 ), T_GRM, 6, 6 )
         ELSE                 
         ANTIL( PADC( "ΔΕΝ ΥΠΑΡΧΕΙ ΤΜΗΜΑ ΜΕ ΚΩΔΙΚΟ ΑΡΙΘΜΟ " + ;
                mAREGG, T_STL+1 ), T_GRM, 6, 6 )
         ENDIF        
         BEEP()       
         HOT_INKEY(3)         
       ELSE
        REC := RECNO()
       ENDIF
      
       GO REC

         SCRNREST( SCR )    
        
      DBSETORDER( 0 )

Ένα κλικ μακριά και από το άλμπουμ «Εστουδιαντίνα ΙΙ, Δάκρυ στο Γυαλί» (2006) το τραγούδι «Κερύνεια» με τους Παντελή Θαλασσινό, Γιώργο Νταλάρα σε μουσική του πρώτου και στίχους του Πόλυ Κυριάκου:


14/04/2019

7 σχόλια:

  1. Α τι ωραία!
    Δεν κατάλαβα τίποτα!
    Άσχετη γαρ με τα του προγραμματισμού!
    Μόνο τα του βλογ κάπως κατέχω.
    Κατά τα λοιπά, πλήρη μεσάνυχτα!
    Οπότε θα ακούσω το τραγούδι, θα πω καλημέρα και καλή εβδομάδα και θα αποχωρήσω!

    ΑπάντησηΔιαγραφή
    Απαντήσεις
    1. Καλημέρα, Καλημέρα! Κι εγώ που, από προγραμματισμό, γνώριζα τώρα, πλέον, δεν! Να είσαι Καλά, Καλή Εβδομάδα!

      Διαγραφή
  2. Αν ξερατε τι διαβασμα εψω ριξει με την καταραμενη την java οταν σπουδαζε ο υιπς πληροφορικαριος θα με λυποσασταν.οχι οτι καταλαβαινα απλα ηθελα να βοηθησω.τρομαρα μου.το μαθημα περαστηκε αλλα το κενο στο κεφαλι μου οχι.Την καλημερα μου.

    ΑπάντησηΔιαγραφή
  3. Συγνωμη για τα λαθη το κινητο φταιει.ο πληροφορικαριος ακομη να διορθωσει τον υπολογιστη.

    ΑπάντησηΔιαγραφή
    Απαντήσεις
    1. Καλησπέρα. Το να βοηθάμε τα παιδιά μας είναι καλό, η υπερβολή, θα έλεγα, όχι. Κρίμα, λοιπόν, που δεν είχατε την ευκαιρία πνευματικής απόλαυσης στην, έμμεση αυτή, ενασχόλησή σας με τον προγραμματισμό. Να είσαστε Καλά!

      Διαγραφή
  4. Καλησπέρα κάτι αντίστοιχο και εγώ. Πολύ διάβασμα στο σπίτι που ξεκίνησε με έναν zx81. Μετά λόγω επαγγέλματος πολύ Lotus 123 και λιγότερα dbase & clipper. Όλα τα σάρωσε μετά η MS με το excel. Προχθές που έπρεπε να χρησιμοποιήσω κάποιες απλές functions του ίδρωσα. Τα έχω ξεχάσει. Καλό καλοκαίρι καλή συνέχεια με το ενδιαφέρον μπλογκ σας.

    ΑπάντησηΔιαγραφή
    Απαντήσεις
    1. Καλησπέρα,

      Τώρα είδα το σχόλιο. Σας ευχαριστώ πολύ.

      Να είσαστε Καλά,
      Καλό ξημέρωμα:)

      Διαγραφή