Archivio

Archive for ottobre 2008

[DB2] – Cos’è un DBRM, un Plan, ed un Package ?

10 ottobre 2008 4 commenti

Quando si sviluppa un Programma COBOLII ( ambiente MainframeMVS ) che accede al Data Base DB2, si devono effettuare una serie di funzioni che non sono necessarie quando un Programma utilizza solo files di tipo VSAM.

Queste funzioni sono eseguite, in maniera semplificata, attraverso il DB2 Interface – ( DB2I ).

Il DB2I è una serie di pannelli ISPF che consentono la “preparazione” dei programmi COBOL – DB2.

Passi per lo sviluppo di un programma COBOLDB2

1. La Precompilazione DB2

Un programma contenente statements SQL deve essere preventivamente analizzato e modificato prima che possa essere compilato. Il Precompilatore DB2 esegue queste funzioni, ed in particolare :

  • – ricerca ed espande i membri realtivi alle INCLUDE
  • – ricerca gli statements EXEC SQL …. END-EXEC
  • – crea una versione del sorgente modificata, in cui ogni statement SQL è commentato e viene  sostituito da un’istruzione CALL ai moduli di interfaccia di runtime del DB2
  • – estrae tutte le istruzioni SQL dal programma e le inserisce in un modulo chiamato DBRM – (Data Base Request Module)
  • – pone un ‘timestamp’ nel sorgente modificato e nel DBRM affinchè ci sia una “corrispondenza esatta” tra i due
  • – riporta gli esiti della precompilazione (eventuali errori, etc…)

Dopo che la fase di precompilazione è terminata, inizia quella della compilazione. Il compilatore COBOL compila il programma sorgente modificato (dal precompilatore) e produce un modulo oggetto.

Il Linkage Editor “links” (collega) il modulo oggetto (object module) con altri moduli richiesti includendo tutti i moduli necessari per l’interfaccia al DB2; questo produrrà un modulo caricabile (load module) …

… ma prima che il programma possa essere eseguito,  il DB2 deve eseguire la fase di BIND !

 

2. La fase di BIND

Il comando BIND è un tipo di “compilazione” delle istruzioni SQL.

In generale, il comando BIND legge gli statements SQL dai DBRMs e produce un meccanismo per accedere ai dati come indicato dagli statements SQL.

Ci sono due tipi di comandi BIND :

     – BIND PLAN e

     – BIND PACKAGE

 

2.1  Il comando BIND PLAN

Il comando BIND PLAN accetta in INPUT :

  • Uno o più DBRMs prodotti dalla precompilazione
  • Uno o più PACKAGEs prodotti da una precedente BIND PACKAGE
  • … oppure una combinazione di liste di DBRMs e PACKAGEs

 

L’OUTPUT del comando BIND PLAN è un PIANO APPLICATIVO contenente la rappresentazione della logica eseguibile degli accessi ottimizzati ai dati del DB2.

Un PLAN (PIANO APPLICATIVO) è eseguibile solo con un modulo caricabile (load module) corrispondente !

Prima di eseguire un Programma COBOL-DB2, si deve specificare il PLAN corispondente.

 

 

2.2  Il comando BIND PACKAGE

Il comando BIND PACKAGE accetta in INPUT :

  • Un solo DBRM e produce (OUTPUT) un singolo PACKAGE contenente la logica ottimizzata di accesso ai dati.

Successivamente, i PACKAGEs prodotti devono essere collegati in un PLAN (PIANO APPLICATIVO) con il comando BIND PLAN.

Un PACKAGE non è eseguibile e non può essere specificato quando si esegue il programma DB2!

dobbiamo sempre ottenere prima un PLAN (PIANO APPLICATIVO) !

 

Il processo di BIND

La fase di BIND esegue una serie di funzioni per creare i PACKAGEs o i PLANs che accedono ai dati DB2 richiesti, tra cui :

  • – lettura e controllo della sintassi SQL dai DBRMs
  • – controllo delle TABELLE DB2 e delle COLONNE a cui si accede se conformi a quelle presenti nel CATALOGO DB2
  • – validazione delle AUTORIZZAZIONI
  • – ottimizzazione degli statements SQL in “paths” (cammini) più efficienti (DB2 optimizer)

 

 

Al termine di queste due fasi (precompilazione DB2 / compilazione COBOL e BIND) , sono stati prodotti due COMPONENTI (separati)

  • Il PLAN DB2
  • … ed il modulo caricabile linkato (load module); il nostro programma eseguibile 🙂

… ma nessuno dei due è eseguibile senza l’altro!

Quando si esegue un programma contenente istruzioni SQL si deve specificare il PLAN che verrà utilizzato.

 

 

Cos’è un DBRM ?

Spesso si fa confusione con la definizione di DBRM e le sue relazioni ai programmi, plans e packages.

Un DBRM è un modulo contenente gli statements SQL estratti dal programma sorgente ( dal precompilatore ).

Esso è memorizzato come membro di un data set partizionato; non è memorizzato nel Catalogo DB2.

 

Cos’è un PLAN ?

Un PLAN è un modulo eseguibile contenete la logica dei ‘paths’ di accesso (ai dati), prodotti dal DB2 Optimizer.

Esso può essere composto da uno o più DBRMs o PACKAGEs.

 

Cos’è un PACKAGE ?

Un PACKAGE è il prodotto del comando BIND su di un singlo DBRM contenete i ‘paths’ ottimizzati di accesso ai dati (dalla v2.3 del DB2).

Per eseguire un PACKAGE, bisogna prima inserirlo nella lista dei PACKAGEs di un PLAN.

Un PACKAGE non è mai eseguito direttamente, esso è eseguito indirettamente quando verrà eseguito il PLAN che lo contiene.

Un PLAN può consistere di uno o più DBRMs, uno o più PACKAGEs, o combinazioni di DBRMs e PACKAGEs.

 

Ma qual’è la differenza tra un PLAN ed un PACKAGE ?

Prima di andare al supermercato,  in genere,  prepariamo la LISTA dei PRODOTTI da acquistare.

Una volta li, come troviamo un prodotto presente nella nostra LISTA, lo mettiamo nel carrello; arrivati alla cassa, paghiamo 😦 ed inseriamo tutti PRODOTTI acquistati in una BUSTA.

  • I PRODOTTI acquistati, sono i DBRMs
  • … e la BUSTA, è il PLAN (PIANO APPLICATIVO)

Ci possono essere più DBRMs in un PLAN (ci sono più PRODOTTI acquistati nella BUSTA).

… abbiamo effettuato una fase di BIND PLAN indicando come INPUT uno o più DBRMs.

Se invece di prendere i PRODOTTI dallo scaffale e metterli nel carrello segniamo la loro ubicazione sulla nostra LISTA, una volta alla cassa, possiamo consegnare la LISTA al cassiere per il conteggio.

Dopo il conteggio ed il pagamento :(, inseriamo la LISTA dei PRODOTTI acquistati con le relative ubicazioni nella BUSTA, … e non i PRODOTTI !

Il PLAN (la BUSTA) ora contiene la LISTA che fa riferimento alla posizione fisica dei PRODOTTI sugli scaffali.

  • La LISTA dei PRODOTTI con le relative ubicazioni, è la lista dei PACKAGEs

… abbiamo prima effettuato le fasi di BIND PACKAGE indicando in INPUT i DBRMs (ubicazione dei prodotti), e poi la fase di BIND PLAN indicando in INPUT la LISTA dei PACKAGEs. 

 

… dedicato a tutti quei giovani che ancora oggi sono “reclutati” nel mondo dei mainframe.

“Una nuova vita vi attende nelle colonie Extra-Mondo. L’occasione per ricominciare in un Eldorado di buone  occasioni e di avventure, un nuovo clima, divertimenti ricreativi…”
                                              ( Annuncio pubblicitario dall’alto, dal film Blade Runner – Ridley Scott 1982 )

Categorie:DB2 - SQL

[DELPHI] – Impostare e ripristinare la risoluzione del Video

L’esempio di seguito mostra come impostare e ripristinare la risoluzione video richiamando l’API di Windows : ChangeDisplaySettings().


unit USetVideo;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, Buttons;

type
  TForm1 = class(TForm)
    B_SET: TBitBtn;
    B_RESET: TBitBtn;

    procedure B_SETClick(Sender: TObject);
    procedure B_RESETClick(Sender: TObject);

    function  ImpostaRisoluzioneVideo(pWidth:Integer; pHeight:Integer): Integer;

  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1 : TForm1;

  // ... Variabili globali contenenti i valori della risoluzione
  //     del video prima della nuova impostazione
  OldWidth  : Integer;
  OldHeight : Integer;

implementation
{$R *.DFM}
// .........................................................................
//   PROCEDURE : B_SETClick()
//               CLICK SUL BOTTONE : B_SET
// .........................................................................
procedure TForm1.B_SETClick(Sender: TObject);
begin
    // ... salva la risoluzione del Video Corrente
    OldWidth    := GetSystemMetrics(SM_CXSCREEN);
    OldHeight   := GetSystemMetrics(SM_CYSCREEN);

    // ... imposta la risoluzione Video ( es.: 1024 x 768 )
    ImpostaRisoluzioneVideo(1024, 768);
end;
// .........................................................................

// .........................................................................
//   FUNCTION : ImpostaRisoluzioneVideo()
//              IMPOSTAZIONE DELLA RISOLUZIONE VIDEO
// .........................................................................
function TForm1.ImpostaRisoluzioneVideo(pWidth, pHeight:Integer):Integer;
var
    DeviceMode: TDeviceMode;
begin

    // ... imposta i parametri della struttura TDeviceMode
    DeviceMode.dmSize       := SizeOf(TDeviceMode);
    DeviceMode.dmPelsWidth  := pWidth;
    DeviceMode.dmPelsHeight := pHeight;
    DeviceMode.dmFields     := DM_PELSWIDTH or DM_PELSHEIGHT;

    // ... richiama l'API di Windows per il set della risoluzione.
    //     Il secondo parametro rappresenta il Flag per il set.
    //
    //     Valori :
    //
    //    0                   = La risoluzione e' cambiata dinamicamente
    //    CDS_UPDATEREGISTRY  = La risoluzione e' cambiata dinamicamente e
    //                          sara' aggiornata nel registro
    //                          La modalita' e' memorizzata nel profilo
    //                          utente
    //    CDS_TEST            = Il sistema verifica se e' possibile impostare
    //                          la risoluzione (effettua un TEST)

    // ... per maggiori dettagli vedere l'SDK di Windows.

    Result := ChangeDisplaySettings(DeviceMode, CDS_UPDATEREGISTRY);

    //  ... possibili valori di ritorno :
    //
    //  DISP_CHANGE_SUCCESSFUL	= Impostazione effettuata con successo.
    //  DISP_CHANGE_RESTART	    = Il Sistema deve essere riavviato affinche'
    //                            l'impostazione abbia effetto.
    //  DISP_CHANGE_BADFLAGS	= Valore dei Flags passati errati.
    //  DISP_CHANGE_FAILED	    = Errore durante l'impostazione della
    //                            risoluzione.
    //  DISP_CHANGE_BADMODE	    = Risoluzione Video non supportata.
    //  DISP_CHANGE_NOTUPDATED  = Windows NT solo : non in grado di scrivere
    //                            nel registro.
end;
// .........................................................................

// .........................................................................
//   PROCEDURE : B_RESETClick()
//               CLICK SUL BOTTONE : B_RESET
// .........................................................................
procedure TForm1.B_RESETClick(Sender: TObject);
begin
    // ... Ripristina la risoluzione video con i valori salvati
    ImpostaRisoluzioneVideo(OldWidth, OldHeight);
end;
// .........................................................................

// ... END OF JOB

end.