If anyone finds this script useful or has ideas for improvement
please forward them to me Eric Hansen at [EMAIL PROTECTED]
I am no expert with ODBC, or GUI for that matter, but I have found
this script useful and wish to make it more useful/sound. Please
give it a try and let me know your ideas. Thanks. If you don't see
# END SCRIPT at the end, then my message was truncated. If this
happens, email me and I will send you the script file.
Regards,
Eric Hansen
Dallas, Texas U.S.A
# Name: dbscrollgrid.pl
# Purpose: Database scrollcursor grid (Perl Win32::ODBC,GUI)
# Author: Eric Hansen, Copyright 1999, Information
# Technology Services, Inc. Dallas, TX
# Contact: [EMAIL PROTECTED]
# Description: Display an ODBC SQL result set in a GUI database grid
# allowing the user to navigate back and forth through
# the result set. This script uses a scroll cursor on
# the database. Large SQL result sets may be navigated
# in this way. 100 rows maximum are loaded to the grid
# from the result set at any one time. By clicking the
# Next or Prev buttons, the user can load the next or
# previous 100 rows from the result set.
# Requirements:Pass DataSourceName(DSN) on command line. Create an
# SQL statement in a file called dbscrollgrid.sql in the
# current directory for input to dbscrollgrid.pl.
# Your ODBC driver must support scrolling cursors.
# You must configure your DSN to enable scrolling cursors.
# i.e. Informix Driver has a checkbox you must check to
# enable scrolling cursors.
use Win32::GUI;
use Win32::ODBC;
# Hide the Dos Window
($DOShwnd, $DOShinstance) = GUI::GetPerlWindow();
GUI::Hide($DOShwnd);
$DSN=$ARGV[0];
if (! $DSN) {
GUI::MessageBox($dummy,"You did not pass the DataSourceName",
"Error",16,);
exit;
}
open(SQL,"dbscrollgrid.sql") || do {
GUI::MessageBox($dummy,"Where's file dbscrollgrid.sql?",
"Error",16,);
exit;
};
$sqltxt='';
while ($rec=<SQL>) {
chomp $rec;
$sqltxt=$sqltxt . " " . $rec;
}
close(SQL);
#-------------------------#
# Window Controls
#-------------------------#
$W = new GUI::DialogBox(
-name => "Window",
-text => "dbscrollgrid.pl - Database Scroll Grid (Win32::ODBC,Win32::GUI)",
-width => 700,
-height => 510,
-left => 10,
-top => 10,
);
$Font = new GUI::Font(
-name => "Tahoma",
-size => 8,
-weight => 700,
-height => -11,
);
$Status = new GUI::StatusBar($W,
-text => " ",
-font => $Font,
-width => $W->ScaleWidth,
);
$LV = new GUI::ListView($W,
-name => "ListView",
-font => $Font,
-left => 10,
-top => 10,
-width => $W->ScaleWidth-20,
-height => $W->ScaleHeight-100,
);
$LV->TextColor(hex("0000FF")); # red
$LV->View(1); # detailed listing
$Prev = $W->AddButton(-name => "Prev",
-text => "Prev",
-width => 45,
-height => 18,
-left => 15,
-top => 410,
);
$Next = $W->AddButton(-name => "Next",
-text => "Next",
-width => 45,
-height => 18,
-left => 15,
-top => 435,
);
$SqlLabel = $W->AddLabel(-name => "SqlLabel",
-width => 610,
-height => 60,
-background => [255,255,255],
-left => 70,
-top => 402,
);
#----------------------------#
# Window Dialog
#----------------------------#
$W->Show;
Connect_To_Database();
Execute_SQL();
Load_Table_Column_Headings();
Next_Click();
GUI::Dialog;
#----------------------------#
# Non-Event Subroutines
#----------------------------#
END {
if ($db) {$db->Close();}
GUI::Show($DOShwnd);
}
sub Connect_To_Database {
$db = new ODBC($DSN);
if (! $db) {
GUI::MessageBox($W,"Can't Establish Database Connection to DSN '$DSN'",
"Error",16,);
GUI::MessageBox($W,"Shutting Down the Application","Status",64,);
exit;
}
$db->SetStmtCloseType(SQL_DONT_CLOSE);
$db->SetStmtOption($db->SQL_CURSOR_TYPE,$db->SQL_CURSOR_DYNAMIC);
$db->SetStmtOption($db->SQL_CURSOR_TYPE,$db->SQL_CURSOR_STATIC);
}
sub Execute_SQL {
$SqlLabel->Text($sqltxt);
$ret = $db->Sql($sqltxt);
if ($ret) {
$error=$db->Error(); # database error msg
GUI::MessageBox($W,$error,"Error",16,);
GUI::MessageBox($W,"Shutting Down the Application","Status",64,);
exit;
}
}
sub Load_Table_Column_Headings {
$LV->InsertColumn(-index => 0,-width => 50, -text => "Row#");
@Cols = $db->FieldNames();
$lastcol=$#Cols;
for($i=0;$i<$lastcol;$i++) {
$columname=$Cols[$i];
$LV->InsertColumn(-index => ($i+1),-width => 100, -text => $columname);
}
}
sub Load_Table_Data {
$Status->Text("Loading Database Grid...");
$Status->Update;
$itemcnt=0;
$rowcnt=$db->GetStmtOption($db->SQL_ROW_NUMBER());
$LV->InsertItem(-item => $itemcnt, -text => $rowcnt);
@Data=(); # clear the data array
@Data = $db->Data();
$lastfld=$#Data;
$subitemcnt=1;
for($i=0;$i<$lastfld;$i++) {
$fieldvalue=$Data[$i];
$LV->SetItem(-item => $itemcnt,
-subitem => $subitemcnt,
-text => $fieldvalue,
);
$subitemcnt++;
}
$itemcnt++;
while ($db->FetchRow()) {
$rowcnt=$db->GetStmtOption($db->SQL_ROW_NUMBER());
$LV->InsertItem(-item => $itemcnt, -text => $rowcnt);
@Data=(); # clear the data array
@Data = $db->Data();
$lastfld=$#Data;
$subitemcnt=1;
for($i=0;$i<$lastfld;$i++) {
$fieldvalue=$Data[$i];
$LV->SetItem(-item => $itemcnt,
-subitem => $subitemcnt,
-text => $fieldvalue,
);
$subitemcnt++;
}
$itemcnt++;
if ($itemcnt == 100) {last;}
}
if ($itemcnt < 100) {
$db->FetchRow(0,SQL_FETCH_LAST);
$rowcnt=$db->GetStmtOption($db->SQL_ROW_NUMBER());
}
$Status->Text("DataSourceName=$DSN");
$Status->Update;
}
#----------------------------#
# Window Events
#----------------------------#
sub Window_Terminate {
if ($db) {$db->Close();}
GUI::Show($DOShwnd);
exit;
}
sub Prev_Click {
$LV->Clear();
if ($rowcnt > 200) {
$pos=($rowcnt % 100);
if ($pos == 0) {$pos=199;}
else {$pos+=99;}
$db->FetchRow(($pos * -1),SQL_FETCH_RELATIVE);
}
else {
$db->FetchRow(0,SQL_FETCH_FIRST);
}
Load_Table_Data();
}
sub Next_Click {
$LV->Clear();
if ($db->FetchRow()) {
Load_Table_Data();
}
else {
$db->FetchRow(0,SQL_FETCH_LAST);
$rowcnt=$db->GetStmtOption($db->SQL_ROW_NUMBER());
Prev_Click();
}
}
# END SCRIPT