# This script may be a better example. It loads a textfile
# to an Access Database.  The user selects the file to load
# through the Open File Dialog. Notice that -owner it set to the
# $W window so that the user must exit the Open file dialog 
# before allowing them back to the window it was called from.
# Script shows how to use the Status and Progress bar jointly. 
# Progress bar shows progress of the file load based on the size
# of the file in bytes and the position of the record pointer in bytes.

use Win32::GUI;
use Win32::ODBC;

# Hide the Dos Window 
($DOShwnd, $DOShinstance) = GUI::GetPerlWindow();
GUI::Hide($DOShwnd);

$M = GUI::MakeMenu(
    "&File"     => "File",
    " > &Open"  => "Open",
    " > E&xit"  => "Exit",
    "&Help"     => "File",
    " > &About - Load EDI/ASN File"  => "About",
);

$W = new GUI::Window(
    -title    => "Load EDI/ASN File",
    -left     => 100, 
    -top      => 100, 
    -width    => 500, 
    -height   => 200,
    -menu     => $M,
    -style    => ws_sysmenu,
    -name     => "Window",
);

$B = new GUI::Bitmap('MCLogo.bmp'); 
$BITMAP = $W->AddLabel(
    -left => 0, 
    -top => 0,
    -style => 14 | WS_VISIBLE,
    -name => "Bitmap",
);
$BITMAP->SetImage($B);

$SFont = new Win32::GUI::Font(
    -name => "Tahoma",
    -size => 8,
    -weight => 700,
    -height => -11,
);

$Status = $W->AddStatusBar(
    -text => " ",
    -font => $SFont,
);

$Progress = new GUI::ProgressBar(
    $Status,
    -width  => $Status->Width/2,
    -height => $Status->Height-3,
    -left   => $Status->Width/2,
    -top    => 2,
);
$Progress->Hide;

$W->Show;
GUI::Dialog();

sub About_Click {
   $msg="";
   $msg=$msg . "Program:  Load EDI/ASN File\n";
   $msg=$msg . " Version:  r2.1\n";
   $msg=$msg . "     Date:  June 1999\n";
   $msg=$msg . "        By:  Eric Hansen\n";
   $msg=$msg . "               Information Technology Services, Inc.\n";
   $msg=$msg . "               Dallas, TX\n";
   GUI::MessageBox($W,"$msg","About - Load EDI/ASN File",64,);
}

sub Open_Click {
    # Open File Dialog Box
    # show files with *.txt extension starting in C:\ directory
    my $file = "*.txt\0" . " " x 256;
    $file = GUI::GetOpenFileName(
        -owner => $W,
        -directory => "C:\\",
        -title => "Load EDI/ASN File", 
        -file => $file,
    );

    # if the EDI file selected exists and is not empty, process it!
    if (-s $file) {
         # open the database connection
         $DSN="EDIdsn"; 
         $db = new Win32::ODBC($DSN); 
         if (! $db) {
            GUI::MessageBox($W,          
                "Can't Establish Database Connection to DSN '$DSN'", 
                "Load EDI/ASN File - Error",16,);
            return;
         }
         # we will commit or rollback based on whether an error occurs or not
         $db->SetConnectOption($db->SQL_AUTOCOMMIT, $db->SQL_AUTOCOMMIT_OFF);

         # setup the Status/Progress Bar and start timing the load process
         $ticks=Win32::GetTickCount();
         $size = -s $file;
         $Status->Text("Loading $file..."); 
         $Status->Update;
         $Progress->SetPos(0);
         $Progress->Show; 

         # open the EDI/ASN File Selected by the User
         $ret="Y"; 
         open(EDI,$file) || do {$ret="N";};
         if ($ret eq "Y") {
            $cnt=0;
            # process each record in the EDI file
            while ($rec=<EDI>) {
               chomp($rec);  # remove linefeed from end of input record
               @fields=split(/,/,$rec);   # parse the input record by delimiter into 
an array
               # ship_date logic for Y2K compliance to ensure a 4 digit year 
               $len=length($fields[1]);
               if ($len == 6) {
                  $yr=(substr($fields[1],0,2) + 0);  
                  $mody=substr($fields[1],2,4);
                  if ($yr < 80) {$yr+=2000;}
                  else {$yr+=1900;}
                  $fields[1]=$yr . $mody;
               }
               $sqltxt="INSERT INTO EDItbl VALUES (";
               for ($i=0;$i<=17;$i++) {
                  if ($i == 0) {$sqltxt=$sqltxt . "'"  . $fields[$i] . "'";}
                  else {$sqltxt=$sqltxt . ",'" . $fields[$i] . "'";}
               } 
               $sqltxt=$sqltxt . ",'N')";  # deleted_flag set to "N" for "No"
               $ret=$db->Sql($sqltxt);  # execute the insert statement and get return 
status
               if ($ret) {
                  $error=$db->Error();  # capture the sql error message
                  $db->Transact($db->SQL_ROLLBACK);  # rollback the data load
                  close(EDI);    # close the EDI load file 
                  $db->Close();  # close the database connection
                  $Progress->Hide;
                  $Status->Text(" ");

                  GUI::MessageBox($W,$error, 
                      "Load EDI/ASN File - Error",16,);
                  GUI::MessageBox($W,$sqltxt, 
                      "Load EDI/ASN File - SQL",16,);
                  GUI::MessageBox($W,"Database Rolled Back",   
                      "Load EDI/ASN File - Status",64,);
                  return;
               }
               $cnt++; 
               $Progress->SetPos(tell(EDI)*100/$size);
               $Progress->Update;
            }
            close(EDI);                      # close the EDI File
            $db->Transact($db->SQL_COMMIT);  # commit the transactions 
            $db->Close();                    # close the database connection

            $elapsed=Win32::GetTickCount();
            $elapsed -= $ticks;
            $Status->Text($cnt . " rows loaded in " . ($elapsed/1000) . " secs");
            GUI::MessageBox($W,"$cnt rows loaded from $file",  
                "Load EDI/ASN File - Successful Run",64,);
            $Progress->Hide;
            $Status->Text(" ");
         }
         else {
            $db->Close();      # close the database connection
            $Progress->Hide;
            $Status->Text(" ");
            GUI::MessageBox($W,"Can't open file $file",  
               "Load EDI/ASN File - Error",16,);
         }
    }    
}

sub Exit_Click {
  Window_Terminate();
}

sub Window_Terminate {
  if ($db) {$db->Close();}
  GUI::Show($DOShwnd);
  exit;
}

END {
  if ($db) {$db->Close();}
  GUI::Show($DOShwnd);
}

# End Script 

-----Original Message-----
From:   Moore, Paul [SMTP:[EMAIL PROTECTED]]
Sent:   Friday, July 16, 1999 3:28 AM
To:     '[EMAIL PROTECTED]'; '[EMAIL PROTECTED]'
Subject:        RE: [perl-win32-gui] Win32::GUI Tutorial, part 1

> From: christopher paul [mailto:[EMAIL PROTECTED]]
> 
> would be cool to see some things like "how to call up a color 
> picker" a "file-open/save dialog" .. also eric's dbgrid would
> make a great chapter, if he's keen.
> 

Thanks for the encouragement. I'll certainly look at colour pickers and
file dialogs - but I haven't got to the point where *I* know how to use
them yet, so I'll take things in the order I discover them for now.

I'll look at the dbgrid, but I was also thinking of using (when I get a
bit more advanced!) listviews and DBI to do a SQL query viewer (my job
is as a DBA, so it's relevant to me), as a way of learning list views.
Maybe I could include a comparison with the dbgrid approach...

Anyway, it's good to know the stuff is useful.

Paul.


Reply via email to