What code will print schema to file?

Crittar

Member
Depends what exactly you want.

You can output to file from Tools, database, reports.

Or you could code something up to do it - can we have a few more details of your requirements please?
 

JTWilson

New Member
Here's something that will sort of do what you want... just update output everything... I use this to reconcile two DB's schemas in a while you can show to developers.

Code:
&SCOPED-DEFINE MAINDB DB1_name
&SCOPED-DEFINE SECONDDB DB2_name

DEF VAR cv_answer AS CHAR NO-UNDO.
DEF VAR lv_i      AS INT  NO-UNDO.
DEF VAR hv_maindb AS HANDLE NO-UNDO.
DEF VAR hv_seconddb AS HANDLE NO-UNDO.


CREATE BUFFER hv_maindb FOR TABLE "{&MAINDB}._field".
CREATE BUFFER hv_seconddb FOR TABLE "{&SECONDDB}._field".

OUTPUT TO "c:\temp\diff.csv".

FOR EACH {&MAINDB}._file WHERE
    {&MAINDB}._file._File-Name = "container" 
    OR {&MAINDB}._file._File-Name = "order" 
NO-LOCK BY {&MAINDB}._file._File-Name:

    FIND {&SECONDDB}._file WHERE 
         {&SECONDDB}._file._file-name = {&MAINDB}._file._File-Name 
      NO-LOCK NO-ERROR.
    
    FOR EACH {&MAINDB}._Field WHERE 
        {&MAINDB}._Field._File-recid = RECID({&MAINDB}._file)
    NO-LOCK:
        FIND {&SECONDDB}._field WHERE 
             {&SECONDDB}._Field._File-recid = RECID({&SECONDDB}._file) 
         AND {&SECONDDB}._Field._Field-Name = {&MAINDB}._Field._Field-Name
          NO-LOCK NO-ERROR.
        
        IF AVAILABLE {&SECONDDB}._field
        THEN DO:
            cv_answer = "".
            /*DISP {&MAINDB}._Field.*/
            BUFFER-COMPARE {&MAINDB}._Field 
                EXCEPT _file-recid
                TO {&SECONDDB}._field  
                SAVE RESULT IN cv_answer.
            
            /*If different output details to a file*/
            IF cv_answer <> "" 
            THEN DO: 
                /*MESSAGE cv_answer. PAUSE.*/
                /*hv_maindb:FIND-FIRST("where _file-recid = " + RECID({&MAINDB}._file) 
                                     + " AND _Field-Name = " + {&MAINDB}._Field._Field-Name 
                                     ) NO-ERROR.*/
                hv_maindb:FIND-BY-ROWID( ROWID({&MAINDB}._field), NO-LOCK ).
                hv_seconddb:FIND-BY-ROWID( ROWID({&SECONDDB}._field), NO-LOCK ).
                
                IF hv_maindb:AVAILABLE AND
                   hv_seconddb:AVAILABLE
                THEN DO:
                    PUT UNFORMATTED "Table,Field,Att,{&MAINDB},{&SECONDDB}, " '"(' cv_answer ')"' SKIP.
                    lv_i = 1.
                    REPEAT WHILE lv_i <= NUM-ENTRIES(cv_answer):
                        PUT UNFORMATTED {&MAINDB}._file._File-Name
                             "," hv_maindb:BUFFER-FIELD("_Field-Name"):BUFFER-VALUE   
                             "," ENTRY(lv_i, cv_answer, ",") 
                             "," '"' hv_maindb:BUFFER-FIELD(ENTRY(lv_i, cv_answer, ",")):BUFFER-VALUE '"'
                             "," '"' hv_seconddb:BUFFER-FIELD(ENTRY(lv_i, cv_answer, ",")):BUFFER-VALUE '"'
                            SKIP.
                        lv_i = lv_i + 1.
                    END.
                    PUT SKIP(1).
                END.
            END. /*If cv_answer <> ""*/
        END.  /*available {&SECONDDB}._field*/
    END. /*Each Field*/
END. /*Each file*/

OUTPUT CLOSE.
 
Top