]> granicus.if.org Git - postgresql/commitdiff
Update Pgaccess to 0.83
authorMarc G. Fournier <scrappy@hub.org>
Thu, 12 Mar 1998 13:09:46 +0000 (13:09 +0000)
committerMarc G. Fournier <scrappy@hub.org>
Thu, 12 Mar 1998 13:09:46 +0000 (13:09 +0000)
src/bin/pgaccess/README.pga
src/bin/pgaccess/formdemo.sql [new file with mode: 0644]
src/bin/pgaccess/forms.html
src/bin/pgaccess/index.html
src/bin/pgaccess/pgaccess.tcl
src/bin/pgaccess/specialchars.html [new file with mode: 0644]

index ef157061367990e58909ad5e0bed8ec94898e582..dd11482e35bb560ee6f4da61dd545612ab6492ff 100644 (file)
@@ -24,7 +24,7 @@ PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
 
 
 
-PGACCESS 0.81 March 1998
+PGACCESS 0.83 11 March 1998
 ================================
 I dedicate this program to my little 4 year daughter Ana-Maria and my wife
 for their understanding. I hope they will forgive me for spending so many
@@ -128,7 +128,7 @@ Reports
 Forms
 - open user defined forms
 - form design module available
-- query widget qlowing access to a recordset
+- query widget allowing access to a recordset
 
 Scripts
 - define, modify and call user defined scripts
diff --git a/src/bin/pgaccess/formdemo.sql b/src/bin/pgaccess/formdemo.sql
new file mode 100644 (file)
index 0000000..d8ef2ae
--- /dev/null
@@ -0,0 +1,77 @@
+CREATE TABLE pga_queries (queryname varchar(64), querytype char(1), querycommand text);
+CREATE TABLE pga_forms (formname varchar(64), formsource text);
+CREATE TABLE pga_scripts (scriptname varchar(64), scriptsource text);
+CREATE TABLE pga_reports (reportname varchar(64), reportsource text, reportbody text, reportprocs text, reportoptions text);
+CREATE TABLE phonebook (name varchar(32), phone_nr varchar(16), city varchar(32), company bool, continent char16);
+CREATE TABLE pga_layout (tablename varchar(64), nrcols int2, colnames text, colwidth text);
+COPY pga_queries FROM stdin;
+\.
+COPY pga_forms FROM stdin;
+Phone book     pb 26 {1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26} 444x310+284+246 {label label1 {33 12 63 30} {} Name {}} {entry name_entry {87 9 217 30} {} entry2 pbqs(name)} {label label3 {33 39 73 54} {} Phone {}} {entry entry4 {87 36 195 57} {} entry4 pbqs(phone_nr)} {label label5 {33 66 78 84} {} City {}} {entry entry6 {87 63 195 84} {} entry6 pbqs(city)} {query qs {3 6 33 33} {} query7 {}} {button button8 {126 177 198 203} {.pb.qs:setsql "select oid,* from phonebook where name ~* '$what' order by name"\
+.pb.qs:open\
+set nrecs [.pb.qs:nrecords]\
+.pb.qs:updatecontrols\
+.pb.qs:fill .pb.allnames name} Find {}} {button button9 {159 276 229 302} {.pb.qs:close\
+.pb.qs:clearcontrols\
+set nrecs {}\
+set what {}\
+destroy .pb\
+} Exit {}} {button button10 {102 249 124 269} {.pb.qs:movefirst\
+.pb.qs:updatecontrols\
+} |< {}} {button button11 {129 249 151 269} {.pb.qs:moveprevious\
+.pb.qs:updatecontrols\
+} << {}} {button button12 {156 249 178 269} {.pb.qs:movenext\
+.pb.qs:updatecontrols} >> {}} {button button13 {183 249 205 269} {.pb.qs:movelast\
+.pb.qs:updatecontrols\
+} >| {}} {checkbox checkbox14 {33 87 126 105} {} {Is it a company ?} pbqs(company)} {radio usa {63 108 201 120} {} U.S.A. pbqs(continent)} {radio europe {63 126 204 141} {} Europe pbqs(continent)} {radio africa {63 144 210 159} {} Africa pbqs(continent)} {entry entry18 {30 180 117 198} {} entry18 what} {label label19 {108 219 188 234} {} {records found} {}} {label label20 {90 219 105 234} {} { } nrecs} {label label21 {3 252 33 267} {} OID= {}} {label label22 {39 252 87 267} {} { } pbqs(oid)} {button button23 {9 276 79 302} {set oid {}\
+catch {set oid $pbqs(oid)}\
+if {[string trim $oid]!=""} {\
+   sql_exec noquiet "update phonebook set name='$pbqs(name)', phone_nr='$pbqs(phone_nr)',city='$pbqs(city)',company='$pbqs(company)',continent='$pbqs(continent)' where oid=$oid"\
+} else {\
+  tk_messageBox -title Error -message "No record is displayed!"\
+}\
+\
+} Update {}} {button button24 {84 276 154 302} {set thisname {}\
+catch {set thisname $pbqs(name)}\
+if {[string trim $thisname]!=""} {\
+sql_exec noquiet "insert into phonebook values ('$pbqs(name)','$pbqs(phone_nr)','$pbqs(city)','$pbqs(company)','$pbqs(continent)')"\
+tk_messageBox -title Information -message "A new record has been added!"\
+} else {\
+  tk_messageBox -title Error -message "This one doesn't have a name ?\
+}\
+\
+} {Add new} {}} {button button25 {168 111 231 135} {.pb.qs:clearcontrols\
+# clearcontrols stillinitialise\
+# incorectly booleans controls to {}\
+# so I force it to 'f' (false)\
+set pbqs(company) f\
+focus .pb.name_entry} New {}} {listbox allnames {246 12 432 240} {} listbox26 {}}
+A simple demo form     asdf 14 {1 2 3 4 5 6 7 8 9 10 11 12 13 14} 377x315+170+155 {label label1 {15 36 99 57} {} {Selected color} {}} {entry entry2 {111 36 225 54} {} entry2 color} {radio red {249 21 342 36} {} {Red as cherry} color} {radio green {249 45 342 60} {} {Green as a melon} color} {radio blue {249 69 342 84} {} {Blue as the sky} color} {button button6 {45 69 198 99} {set color spooky} {Set a weird color} {}} {label label7 {24 129 138 147} {} {The checkbox's value} {}} {entry entry8 {162 129 172 147} {} entry8 cbvalue} {checkbox checkbox9 {180 126 279 150} {} {Check me :-)} cbvalue} {button button10 {219 273 366 303} {destroy .asdf} {Close that simple form} {}} {button button11 {219 237 366 267} {open_form "Phone book"} {Open my phone book} {}} {listbox lb {12 192 162 267} {} listbox12 {}} {button button13 {12 156 162 186} {.asdf.lb insert end red green blue cyan white navy black purple maroon violet} {Add some information} {}} {button button14 {12 273 162 303} {.asdf.lb delete 0 end} {Clear this listbox} {}}
+\.
+COPY pga_scripts FROM stdin;
+How are forms keeped inside ?  open_table pga_forms\
+\
+
+\.
+COPY pga_reports FROM stdin;
+\.
+COPY phonebook FROM stdin;
+IBM    623346234       \N      t       usa
+John Doe       +44 35 2993825  Washington      f       usa
+Bill Clinton   +44 35 9283845  New York        f       usa
+Monica Levintchi       +44 38 5234526  Dallas  f       usa
+Bill Gates     +42 64 4523454  Los Angeles     f       usa
+COMPAQ 623462345       \N      t       usa
+SUN    784563253       \N      t       usa
+DIGITAL        922644516       \N      t       usa
+FIAT   623463445       \N      t       europe
+MUGADUMBU      +92 534662634   \N      t       africa
+Frank Zappa    6734567 Montreal        f       usa
+Jimmy Page     66323452                f       europe
+Constantin Teodorescu  +40 39 611820   Braila  f       europe
+NGBENDU Wazabanga      34577345        \N      f       africa
+\.
+COPY pga_layout FROM stdin;
+pga_forms      2       formname formsource     82 713
+phonebook      5       name phone_nr city company continent    150 105 80 66 85
+\.
index 93308cd99ddb559b2e16bed4e5e4133cc21d00c8..6a3f1d165f8a619222d61a38d01ae7e5cb58818a 100644 (file)
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
 <HTML>
 <HEAD>
+   <TITLE></TITLE>
    <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
-   <META NAME="GENERATOR" CONTENT="Mozilla/4.04 [en] (X11; I; Linux 2.0.32 i586) [Netscape]">
+   <META NAME="GENERATOR" CONTENT="Mozilla/3.04Gold (X11; I; Linux 2.0.32 i586) [Netscape]">
 </HEAD>
 <BODY TEXT="#000000" BGCOLOR="#FFEBCD" LINK="#0000EF" VLINK="#51188E" ALINK="#FF0000">
 
-<H1>
-FORMS</H1>
+<H1>FORMS</H1>
 
-<HR WIDTH="100%">
+<P>
+<HR WIDTH="100%"></P>
 
-<P>This version (0.82) of PgAccess introduce the visual form builder.
+<P>This version (0.83) of PgAccess has changed a little the visual form
+builder introduced since 0.82 version : variable handling, query-results
+interface and control bindings naming convention. Please read it carefully,
+download the database demo and practice a while before trying to design
+your own forms.</P>
 
 <P>For the moment, it has only some basic widgets : labels, entries, buttons
-, listboxes , checkboxes and radiobuttons.
+, listboxes , checkboxes and radiobuttons.</P>
+
+<P>Also there is a pseudo query widget that allows you yo have access to
+a query results. </P>
+
+<P><B>How do you generate widgets :</B></P>
+
+<OL>
+<LI>select a widget from the toolbox by clicking the appropriate radiobutton</LI>
+
+<LI>move to the canvas , point with the mouse at the desired location and
+click the mouse button to begin</LI>
+
+<LI>keeping the mouse-button pressed move the mouse in order to draw a
+rectangle that will hold the widget</LI>
 
-<P>Also there is a query widget that allows you yo have access to a query
-results.
+<LI>release the mouse-button </LI>
+</OL>
 
-<P>In a manner very similar with Visual Tcl or Visual Basic, the user must
-select a widget from the toolbar and drags on the canvas the rectangle
-that would define the widget. It can also specify some attributes in a
-separate window. Renaming, resizing items are possible modifying parameters
-in attribute window. Do not forget to press Enter in the edit field after
-changing a value in order to be accepted.
+<P>In the rectangle that you have designed it will appear the selected
+object.<BR>
+Move now to the attribute window to change some of its properties.</P>
+
+<P>Renaming, resizing items are possible (for the moment) only by modifying
+appropriate parameters in attribute window. You <B>must </B>press Enter
+in the edit field after changing a value in order to be accepted. </P>
 
 <P>You can also move items by dragging them or delete them by pressing
-Del key.
+Del key after selecting them.</P>
 
 <P>In attribute window, there are some fields named <B><TT><FONT SIZE=+1>Command
-</FONT></TT></B>and <B><TT><FONT SIZE=+1>Variable</FONT></TT></B>.
+</FONT></TT></B>and <B><TT><FONT SIZE=+1>Variable</FONT></TT></B>. </P>
 
 <P>The field <B><TT><FONT SIZE=+1>Command </FONT></TT></B>have meaning
 only for Button widgets and holds the command that will be invoked when
-the button is pressed.
-
-<P>The field <B><TT><FONT SIZE=+1>Variable </FONT></TT></B>have meaning
-only for EditField , Label widgets and checkboxes and it is the name of
-the global variable that will hold the value for that widget. For checkboxes
-the values are 1 or 0.
-
-<P>In order to make a simple test, put an entry field and set it's variable
-to <B>v1</B> and a button who's command is "set v1 whisky". Press the button
-"Test form" and click on the button. In that entry should appear whisky.
-<BR>Another test is defining in Script module a script called "My first
-script" having the following commands:
-<BR><TT><FONT SIZE=+1>tk_messageBox -title Warning -message "This is my
-first message!"</FONT></TT>
-<BR>and then define a button who's command is <B><TT><FONT SIZE=+1>execute_script
-"My first script"</FONT></TT></B>.
-<H2>
-Database manipulation</H2>
-Let's presume that our form have the internal name <B><TT>mf </TT></B>(my
-form). He wil be referred inside the Tcl/Tk source as <B><TT>.mf</TT></B>
-<BR>If you want to close the form in run-time you have to issue the command
-<B><TT>destroy .mf</TT></B>
+the button is pressed. </P>
+
+<P>&nbsp;&nbsp;&nbsp;&nbsp;The field <B><TT><FONT SIZE=+1>Variable </FONT></TT></B>have
+meaning only for EditField , Label widgets , checkboxes and radiobuttons
+and it is the name of the global variable that will hold the value for
+that widget. For checkboxes the values are <B>t</B> and <B>f</B> (from
+true and false) in order to simplify binding to logical data fields (PgAccess
+0.82 used 0 and 1).</P>
+
+<P>&nbsp;&nbsp;&nbsp;&nbsp;For radiobuttons, it is usual to assign the
+same variable to the same radiobuttons within the same group. That variable
+will contain the name of the widget of the radiobutton that has been pressed.
+Let's presume that you have entered 3 radiobuttons named red, green and
+blue, all of them having the same variable named color. If you will press
+them, they will assign their names to global variable.</P>
+
+<P>&nbsp;&nbsp;&nbsp;&nbsp;In order to make a simple test, put an entry
+field and set it's variable to <B>v1</B> and a button who's command is
+&quot;set v1 whisky&quot;. Press the button &quot;Test form&quot; and click
+on the button. In that entry should appear whisky. <BR>
+Another test is defining in Script module a script called &quot;My first
+script&quot; having the following commands: <BR>
+<TT><FONT SIZE=+1>tk_messageBox -title Warning -message &quot;This is my
+first message!&quot;</FONT></TT> <BR>
+and then define a button who's command is <B><TT><FONT SIZE=+1>execute_script
+&quot;My first script&quot;</FONT></TT></B>. </P>
+
+<H2>Database manipulation</H2>
+
+<P>Let's presume that our form have the internal name <B><TT>mf </TT></B>(my
+form). He will be referred inside the Tcl/Tk source as <B><TT>.mf</TT></B>
+<BR>
+If you want to close the form in run-time you have to issue the command
+<B><TT>destroy .mf</TT></B> </P>
 
 <P>Also, any widget will have the name prefixed by <B><TT>.mf&nbsp;</TT></B>&nbsp;&nbsp;&nbsp;&nbsp;
 We will have <B><TT>.mf.button1</TT></B> or <B><TT>.mf.listbox1</TT></B>
-.
+. </P>
 
 <P>We can name the query widget <B><TT>qry</TT></B> for example. The complete
-name will be <B><TT>.mf.qry</TT></B> then.
-<BR>The <B><TT>Command </TT></B>property of the query widget must contain
-the SQL command that will be executed.
-<BR>When the form will be in run-time, automatically you will have acces
-to the following methods :
-
-<P><TT>.mf.qry:execute</TT> - opens the connection and execute the query
-(returns nothing)
-<BR><TT>.mf.qry:nrecords</TT> - returns the number of records in the selected
-query
-<BR><TT>.mf.qry:fields</TT> - returns a list of the fields in the result
-set
-<BR><TT>.mf.qry:movefirst</TT> - move the cursor to the first record in
-the recordset
-<BR><TT>.mf.qry:movelast , .mf.qry:movenext , .mf.qry:moveprevious </TT>-
-moves the cursor
-<BR><TT>.mf.qry:updatecontrols</TT> - update the variables inside the designed
-form that have a particular name (I'll explain later)
-<BR><TT>.mf.qry:close</TT> - close the connection (<B><FONT COLOR="#FF0000">if
-you don't close the query result, you will loose memory</FONT></B>)
+name will be <B><TT>.mf.qry</TT></B> then. <BR>
+The <B><TT>Command </TT></B>property of the query widget must contain the
+SQL command that will be executed. <BR>
+When the form will be in run-time, automatically you will have acces to
+the following procedures and functions : </P>
+
+<P><B><TT>.mf.qry:open</TT></B> - opens the connection and execute the
+query (returns nothing) <BR>
+<B><TT>.mf.qry:setsql newsql</TT></B> - set the command query that will
+be executed at the next <B><TT>.mf.qry:open<BR>
+.mf.qry:nrecords</TT></B> - returns the number of records in the selected
+query <BR>
+<B><TT>.mf.qry:crtrecord </TT></B>- returns the current record number inside
+the query result<BR>
+<B><TT>.mf.qry:fields</TT></B> - returns a list of the fields in the result
+set <BR>
+<B><TT>.mf.qry:movefirst</TT></B> - move the cursor to the first record
+in the recordset <BR>
+<TT><B>.mf.qry:movelast</B> , <B>.mf.qry:movenext</B> , <B>.mf.qry:moveprevious</B>
+</TT>- moves the cursor there<BR>
+<B><TT>.mf.qry:moveto newrecno</TT></B> - move the cursor to that new record
+number (first is 0)<BR>
+<B><TT>.mf.qry:updatecontrols</TT></B> - update the variables inside the
+designed form that have a particular name (I'll explain later) <BR>
+<B><TT>.mf.qry:clearcontrols</TT></B> - clear the variables inside the
+designed form binded to a query result<BR>
+<TT><B>.mf.qry:fill listbox field</B> </TT>- fill the named listbox (whole
+widget name as <B><TT>.mf.listbox1</TT></B>) with the all the values of
+that field in the current queryresult<BR>
+<B><TT>.mf.qry:close</TT></B> - close the connection (<B><FONT COLOR="#FF0000">if
+you don't close the query result, you will loose some memory</FONT></B>)
+</P>
+
+<P>It's no need to close a query-result if you want to assign it a new
+SQL command and open it again. That will be done automatically.</P>
 
 <P>If you want to bound some controls to the fields of the recordset, you
-will have to name their associate variable like that :
-
-<P><TT>.mf.qry.salary</TT> to get the "salary" field , or <TT>.mf.qry.name</TT>
-to get the "name" field.
-
-<P>It's simple, isn't it ? It's just like a new widget that have some properties
-and methods that can be accesed.
-<BR>Also, the name convention is just like in Tcl/Tk.
+will have to name their associate variable like that : </P>
+
+<P><B><TT>mfqry(salary)</TT></B> to get the &quot;salary&quot; field ,
+or <B><TT>mfqry(name)</TT></B> to get the &quot;name&quot; field. So, you
+take the internale name of the form (without the leading point) and merge
+it with the query-widget name and you will get a associative arrayname.
+The values are given using the field name as a key in this associative
+array.<BR>
+<B><FONT COLOR="#FF0000">* WARNING *</FONT></B> The naming style has been
+changed from 0.82 version of PgAccess and I cannot guarantee that it not
+be changed again in the future. I'm just trying to make it as simple it
+could be. The old style naming convention had some incompatibilities with
+Tcl/Tk syntax.</P>
+
+<P><B><FONT SIZE=+1><FONT COLOR="#9400D3">QUESTION</FONT> : </FONT></B>Do
+you think that it would be more clear if the above functions and procedures
+regarding a query-widget would be named in a similar manner as binded variable
+controls ? That mean, <B><TT>mfqry:open</TT></B> and <B><TT>mfqry:updatecontrols</TT></B>
+instead of <B><TT>.mf.qry:open</TT></B> and <B><TT>.mf.qry:updatecontrols</TT></B>
+?</P>
+
+<P>The only advantage of <B><TT>.mf.qry:open</TT></B> is that is much closer
+to the Tk method of referring objects within a window and it may give to
+the programmer the feeling that he is using a object-oriented widget. Since
+I cannot use further for naming binded variables a similar manner (<B><TT>.mf.qry.salary)</TT></B>
+it might be possible to abandon that naming convention .</P>
+
+<P>Here it is a dumped <B><A HREF="formdemo.sql">sample database</A></B>
+that contains a demo database. What should you do ?<BR>
+Shift-click the above URL in order to download that tiny file (4 Kb). Create
+a empty database and <B><TT>psql yourdatabase &lt;formdemo.sql</TT></B></P>
+
+<P>You should find a single table called &quot;phonebook&quot; a form called
+&quot;Phone book&quot; and another &quot;A simple demo form&quot;.</P>
+
+<P>First of all enter and view the phonebook table in table view. Note
+the fields and their values.<BR>
+Open the &quot;Phone book&quot; form and enter a letter (a, e or i) in
+the field to the left of &quot;Find&quot; button then press Find. It's
+fine to enter one letter in order to get more records in query result.
+You will get information about the number of records selected, in the listbox
+you will see all the values of field &quot;name&quot; from the current
+data set. Use buttons to move to first, next, previous or last record within
+the record set.</P>
+
+<P>In order to add a new record, press the &quot;New&quot; button in order
+to get new, clean entries. Fill them with your data and press &quot;Add
+new&quot; button. A new phonebook record will be added. Also, if you want
+to update a record, change it's values in the displayed fields after finding
+it and press &quot;Update&quot; button. The values will be updated in the
+database BUT NOT IN THE CURRENT QUERY RESULT . If you want to see them
+modified, make a new query trying to find it again.</P>
+
+<P><FONT COLOR="#000080">Before using the results from a query you should
+know that the information that has been retrieved could be found only in
+your computer client memory. It has <B>no live connection</B> to the data
+from the database. That's why it isn't possible to develop a simple update
+function as interface to that query-result widget. More than that : a query
+result could be obtained from a SQL command that return a non-updatable
+data set !!! For example fields gathered from multiple tables or summary
+fields. It isn't just simple to make an automatic update procedure. The
+programmer must know how to make the update or the append procedure, sometimes
+using key fields to point to the desired record or an OID. There are examples
+in the demo database in &quot;Phone book&quot; form. It may be possible
+that in the future, I will develop another pseudo-widget describing a table.
+It would be more simple than to implement an update or append or even a
+delete procedure.</FONT></P>
+
+<P>There is in the demo database also another simple form called &quot;A
+simple demo form&quot;. It will show you how to handle variables from checkboxes,
+radiobuttons, how to use listboxes, open another forms and so on. I think
+they will help you.</P>
 
 <P>In order to avoid naming user defined forms with&nbsp; a particular
 name of another PgAccess form, I would recommend naming them as udf0, udf1
-(user defined form 0 , 1 )
+(user defined form 0 , 1 ) </P>
 
 <P>
-<HR WIDTH="25%">
+<HR WIDTH="25%"></P>
 
 <P>Please feel free to send me your oppinion at <B>teo@flex.ro</B> on forms
-designing and usage.
+designing and usage. </P>
+
+<P><B><FONT SIZE=+1>KEEP IN MIND ! &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;THE
+FORM API WILL CHANGE IN ORDER TO BE MORE SIMPLE AND BETTER!&nbsp;&nbsp;&nbsp;&nbsp;SEND
+ME YOUR WISHES, YOUR IDEAS, YOUR OPINIONS !<BR>
+ALSO ... DON'T BLAME ME IF YOU WILL HAVE TO RE-DESIGN YOUR OLD FORMS DUE
+TO SOME INCOMPATIBILITIES WITH NEWER PGACCESS VERSIONS.</FONT></B></P>
+
 </BODY>
 </HTML>
index b9786719d8cc444f3c49d416b8580dcb45ed5bee..c3bcf2e2db03b991cd35f7e62ff04dd45a6e10af 100644 (file)
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
 <HTML>
 <HEAD>
-   <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
-   <META NAME="GENERATOR" CONTENT="Mozilla/4.04 [en] (X11; I; Linux 2.0.32 i586) [Netscape]">
    <TITLE>PgAccess - a Tcl/Tk PostgreSQL interface</TITLE>
+   <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
+   <META NAME="GENERATOR" CONTENT="Mozilla/3.04Gold (X11; I; Linux 2.0.32 i586) [Netscape]">
 </HEAD>
 <BODY BGCOLOR="#FFFFFF">
 
-<H1>
-PgAccess - a database management tool for <A HREF="http://www.postgreSQL.org">PostgreSQL</A></H1>
+<H1>PgAccess - a database management tool for <A HREF="http://www.postgreSQL.org">PostgreSQL</A></H1>
 
-<HR>
+<P>
+<HR></P>
 
 <P>This program is protected by the following <A HREF="copyright.html">copyright</A>
-<LI>
-<A HREF="pgaccess-0.82.tar.gz">Download the last version of Pgaccess (press
-shift and click this link)</A>.</LI>
+</P>
+
+<LI><A HREF="pgaccess-0.83.tar.gz">Download the last version of Pgaccess
+(press shift and click this link)</A>.</LI>
 
+<P>Latest version of PgAccess is 0.83 , 11 March 1998 ! <BR>
+&nbsp; </P>
 
-<P>Latest version of PgAccess is 0.82 , 1 March 1998 !
-<BR>&nbsp;
 <CENTER><TABLE BORDER=3 CELLSPACING=0 CELLPADDING=0 WIDTH="100%" BGCOLOR="#FFB6C1" >
 <TR>
 <TD>
-<CENTER></CENTER>
-
-<CENTER><B><FONT SIZE=+2>PgAccess can now design <A HREF="forms.html">Forms</A></FONT></B>,
-<B><FONT SIZE=+2><A HREF="pga-rad.html">Reports and Scripts</A></FONT></B></CENTER>
+<CENTER><P><B><FONT SIZE=+2>PgAccess can now design <A HREF="forms.html">Forms</A></FONT></B>,
+<B><FONT SIZE=+2><A HREF="pga-rad.html">Reports and Scripts</A></FONT></B>
+</P></CENTER>
 </TD>
 </TR>
 </TABLE></CENTER>
-I think that there were some problems loading libpgtcl library.
-<BR>I invite you to read a <A HREF="index.html#libpgtcl">special section
-concerning <B>libpgtcl</B></A>
-<H3>
-<FONT COLOR="#191970">What does PgAccess now!</FONT></H3>
-Here are some images from PgAccess windows : <A HREF="pic-pga-1.gif">Main
+
+<H3><FONT COLOR="#000080">Installation problems</FONT></H3>
+
+<UL>
+<LI>Some problems related with locale special characters could be solved
+by this <A HREF="specialchars.html">simple patch</A></LI>
+
+<LI>I think that there were some problems loading libpgtcl library. I invite
+you to read a <A HREF="index.html#libpgtcl">special section concerning
+libpgtcl</A> </LI>
+</UL>
+
+<H3><FONT COLOR="#191970">What does PgAccess now!</FONT></H3>
+
+<P>Here are some images from PgAccess windows : <A HREF="pic-pga-1.gif">Main
 window </A>, <A HREF="pic-pga-2.gif">table builder </A>, <A HREF="pic-pga-4.gif">table(query)
-view </A>, <A HREF="pic-pga-3.gif">visual query builder </A>.
-
-<P><B>Tables</B>
-<BR>- opening tables for viewing, max 200 records (changed by preferences
-menu)
-<BR>- column resizing, dragging the vertical grid line (better in table
-space rather than in the table header)
-<BR>- text wrap in cells - layout saved for every table
-<BR>- import/export to external files (SDF,CSV)
-<BR>- filter capabilities (enter filter like (price>3.14)
-<BR>- sort order capabilities (enter manually the sort field(s))
-<BR>- editing in place
-<BR>- improved table generator assistant
-<BR>- improved field editing
-<BR><B>Queries</B>
-<BR>- define , edit and stores "user defined queries"
-<BR>- store queries as views
-<BR>- execution of queries
-<BR>- viewing of select type queries result
-<BR>- query deleting and renaming
-<BR>- <B><BLINK><FONT COLOR="#FF0000">NEW !!!</FONT></BLINK></B> Visual
-query builder with drag &amp; drop capabilities. For any of you who had
-installed the Tcl/Tk plugin for Netscape Navigator, you can see it at work
-<A HREF="qbtclet.html">clicking here</A>
-<BR><B>Sequences</B>
-<BR>- defines sequences, delete them and inspect them
-<BR><B>Functions</B>
-<BR>- define, inspect and delete functions in SQL language
-<BR><B>Reports</B>
-<BR>- design and display simple reports from tables
-<BR>- fields and labels, font changing, style and size
-<BR>- saves and loads report description from database
-<BR>- show report previews, sample postscript output file
-<BR><B>Forms</B>
-<BR>- open user defined forms
-<BR>- form design module available
-<BR>- query widget available, controls bound to query results
-<BR>- <A HREF="forms.html">click here</A> for a description of forms and
-how they can be used
-<BR><B>Scripts</B>
-<BR>- define, modify and call user defined scripts
-<BR>Here is <A HREF="pga-rad.html">a special section concerning forms and
-scripts</A> .
-
-<P>On the TODO list!
-<BR>- table design (add new fields, renaming, etc.)
-
-<P>&nbsp;
+view </A>, <A HREF="pic-pga-3.gif">visual query builder </A>. </P>
+
+<P><B>Tables</B> <BR>
+- opening tables for viewing, max 200 records (changed by preferences menu)
+<BR>
+- column resizing, dragging the vertical grid line (better in table space
+rather than in the table header) <BR>
+- text wrap in cells - layout saved for every table <BR>
+- import/export to external files (SDF,CSV) <BR>
+- filter capabilities (enter filter like (price&gt;3.14) <BR>
+- sort order capabilities (enter manually the sort field(s)) <BR>
+- editing in place <BR>
+- improved table generator assistant <BR>
+- improved field editing <BR>
+<B>Queries</B> <BR>
+- define , edit and stores &quot;user defined queries&quot; <BR>
+- store queries as views <BR>
+- execution of queries <BR>
+- viewing of select type queries result <BR>
+- query deleting and renaming <BR>
+- visual query builder with drag &amp; drop capabilities. For any of you
+who had installed the Tcl/Tk plugin for Netscape Navigator, you can see
+it at work <A HREF="qbtclet.html">clicking here</A> <BR>
+<B>Sequences</B> <BR>
+- defines sequences, delete them and inspect them <BR>
+<B>Functions</B> <BR>
+- define, inspect and delete functions in SQL language <BR>
+<B>Reports</B> <BR>
+- design and display simple reports from tables <BR>
+- fields and labels, font changing, style and size <BR>
+- saves and loads report description from database <BR>
+- show report previews, sample postscript output file <BR>
+<B>Forms</B> <BR>
+- open user defined forms <BR>
+- form design module available <BR>
+- query widget available, controls bound to query results <BR>
+- <A HREF="forms.html">click here</A> for a description of forms and how
+they can be used <BR>
+<B>Scripts</B> <BR>
+- define, modify and call user defined scripts <BR>
+Here is <A HREF="pga-rad.html">a special section concerning forms and scripts</A>
+. </P>
+
+<P>On the TODO list! <BR>
+- table design (add new fields, renaming, etc.) </P>
+
+<P>&nbsp; </P>
 
 <P>If you have any comment, suggestion for improvements, please feel free
-to e-mail to : <A HREF="mailto:teo@flex.ro">teo@flex.ro&nbsp;</A>
+to e-mail to : <A HREF="mailto:teo@flex.ro">teo@flex.ro&nbsp;</A> </P>
 
 <P><B><FONT COLOR="#FF1493"><FONT SIZE=+2>Mailing list for PgAccess </FONT></FONT></B><A HREF="maillist.html">Here
-you will find how to subscribe to this mailing list</A>.
+you will find how to subscribe to this mailing list</A>. </P>
 
 <P>
-<HR>
-<H1>
-More information about libgtcl</H1>
-Also, you will need the PostgreSQL to Tcl interface library, lined as a
-Tcl/Tk 'load'-able module. It is called libpgtcl and the source is located
+<HR></P>
+
+<H1>More information about libgtcl</H1>
+
+<P>Also, you will need the PostgreSQL to Tcl interface library, lined as
+a Tcl/Tk 'load'-able module. It is called libpgtcl and the source is located
 in the PostgreSQL directory /src/interfaces/libpgtcl. Specifically, you
 will need a libpgtcl library that is 'load'-able from Tcl/Tk. This is technically
 different from an ordinary PostgreSQL loadable object file, because libpgtcl
 is a collection of object files. Under Linux, this is called libpgtcl.so.
-<BR>You can download <A HREF="libpgtcl.so">from here </A>a version already
-compiled for Linux i386 systems. Just copy libpgtcl.so into your system
-library director (/usr/lib) and go for it. One of the solutions is to remove
-from the source the line containing <B>load libpgtcl.so </B>and to load
-pgaccess.tcl not with wish, but with pgwish (or wishpg) that wish that
-was linked with libpgtcl library!
+<BR>
+You can download <A HREF="libpgtcl.so">from here </A>a version already
+compiled for Linux RedHat 4.2 i386 systems. Just copy libpgtcl.so into
+your system library directory (/usr/lib or /lib) and go for it. One of
+the solutions is to remove from the source the line containing <B>load
+libpgtcl.so </B>and to load pgaccess.tcl not with wish, but with pgwish
+(or wishpg) that wish that was linked with libpgtcl library! </P>
 
 <P>If you have installed RedHat 5.0, you should get the last distribution
 kit of postgreSQL and compile it from scratch. RedHat 5.0 is using some
 new versions of libraries and you have to compile and install again at
-least <B>libpq </B>and <B><TT>libpgtcl </TT></B>libraries.
+least <B>libpq </B>and <B><TT>libpgtcl </TT></B>libraries. </P>
+
+<P>However, the application should work without problems! </P>
 
-<P>However, the application should work without problems!
 </BODY>
 </HTML>
index 0a3d3bb8914dad20b8dd75630bec1bec17daca51..775fc3100863af188b1088c37d6baa8a650fc98f 100644 (file)
@@ -728,6 +728,12 @@ if {$fdvar(oper)=="move"} {
 if {$fdvar(oper)!="draw"} return
 set fdvar(oper) none
 .fd.c delete curdraw
+# Check for x2<x1 or y2<y1
+if {$x<$fdvar(xstart)} {set temp $x ; set x $fdvar(xstart) ; set fdvar(xstart) $temp}
+if {$y<$fdvar(ystart)} {set temp $y ; set y $fdvar(ystart) ; set fdvar(ystart) $temp}
+# Check for too small sizes
+if {[expr $x-$fdvar(xstart)]<20} {set x [expr $fdvar(xstart)+20]}
+if {[expr $y-$fdvar(ystart)]<10} {set y [expr $fdvar(ystart)+10]}
 incr fdvar(objnum)
 set i $fdvar(objnum)
 lappend fdvar(objlist) $i
@@ -765,6 +771,7 @@ foreach i $fdvar(objlist) {
 #close $fid
 set res [pg_exec $dbc "delete from pga_forms where formname='$fdvar(formname)'"]
 pg_result $res -clear
+regsub -all "'" $info "''" info
 set res [pg_exec $dbc "insert into pga_forms values ('$fdvar(formname)','$info')"]
 pg_result $res -clear
 cmd_Forms
@@ -815,6 +822,7 @@ catch {set fdvar(c_text) $fdobj($i,l)}
 
 proc {fd_test} {} {
 global fdvar fdobj dbc datasets
+set basewp $fdvar(forminame)
 set base .$fdvar(forminame)
 if {[winfo exists $base]} {
    wm deiconify $base; return
@@ -840,30 +848,82 @@ switch $fdobj($item,t) {
         button $base.$name  -borderwidth 1 -padx 0 -pady 0 -text "$fdobj($item,l)" -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* -command [subst {$cmd}]
     }
     checkbox {
-        checkbutton  $base.$name -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* -text "$fdobj($item,l)" -variable "$fdobj($item,v)" -borderwidth 1
+        checkbutton  $base.$name -onvalue t -offvalue f -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* -text "$fdobj($item,l)" -variable "$fdobj($item,v)" -borderwidth 1
         set wh {}
     }
-    query { set visual 0
-        set procbody "proc $base.$name:execute {} {global dbc datasets ; set datasets($base.$name) \[pg_exec \$dbc \"$fdobj($item,x)\"\] ; set ceva \[$base.$name:fields\]}"
-        eval $procbody
-#        tk_messageBox -message $procbody
-        set procbody "proc $base.$name:nrecords {} {global datasets ; return \[pg_result \$datasets($base.$name) -numTuples\]}"
-        eval $procbody
-#        tk_messageBox -message $procbody
-        set procbody "proc $base.$name:close {} {global datasets ; pg_result \$datasets($base.$name) -clear}"
-        eval $procbody
-#        tk_messageBox -message $procbody
-        set procbody "proc $base.$name:fields {} {global datasets ; set fl {} ; foreach fd \[pg_result \$datasets($base.$name) -lAttributes\] {lappend fl \[lindex \$fd 0\]} ; set datasets($base.$name,fields) \$fl ; return \$fl}"
-#        tk_messageBox -message $procbody
-        eval $procbody
+    query {
+       set visual 0
+       set datasets($base.$name,sql) $fdobj($item,x)
+        eval "proc $base.$name:open {} {\
+               global dbc datasets tup$basewp$name ;\
+               catch {unset tup$basewp$name} ;\
+               set wn \[focus\] ; cursor_watch \$wn ;\
+               set res \[pg_exec \$dbc \"\$datasets($base.$name,sql)\"\] ;\
+               pg_result \$res -assign tup$basewp$name ;\
+               set fl {} ;\
+               foreach fd \[pg_result \$res -lAttributes\] {lappend fl \[lindex \$fd 0\]} ;\
+               set datasets($base.$name,fields) \$fl ;\
+               set datasets($base.$name,recno) 0 ;\
+               set datasets($base.$name,nrecs) \[pg_result \$res -numTuples\] ;\
+               cursor_arrow \$wn ;\
+        }"
+        eval "proc $base.$name:setsql {sqlcmd} {\
+               global datasets ;\
+               set datasets($base.$name,sql) \$sqlcmd ;\
+        }"
+        eval "proc $base.$name:nrecords {} {\
+               global datasets ;\
+               return \$datasets($base.$name,nrecs) ;\
+        }"
+        eval "proc $base.$name:crtrecord {} {\
+               global datasets ;\
+               return \$datasets($base.$name,recno) ;\
+        }"
+        eval "proc $base.$name:moveto {newrecno} {\
+               global datasets ;\
+               set datasets($base.$name,recno) \$newrecno ;\
+        }"
+        eval "proc $base.$name:close {} {
+               global tup$basewp$name ;\
+               catch {unset tup$basewp$name };\
+        }"
+        eval "proc $base.$name:fields {} {\
+               global datasets ;\
+               return \$datasets($base.$name,fields) ;\
+        }"
+        eval "proc $base.$name:fill {lb fld} {\
+               global datasets tup$basewp$name ;\
+               \$lb delete 0 end ;\
+               for {set i 0} {\$i<\$datasets($base.$name,nrecs)} {incr i} {\
+                       \$lb insert end \$tup$basewp$name\(\$i,\$fld\) ;\
+               }
+        }"
         eval "proc $base.$name:movefirst {} {global datasets ; set datasets($base.$name,recno) 0}"
-        eval "proc $base.$name:movenext {} {global datasets ; incr datasets($base.$name,recno)}"
+        eval "proc $base.$name:movenext {} {global datasets ; incr datasets($base.$name,recno) ; if {\$datasets($base.$name,recno)==\[$base.$name:nrecords\]} {$base.$name:movelast}}"
         eval "proc $base.$name:moveprevious {} {global datasets ; incr datasets($base.$name,recno) -1 ; if {\$datasets($base.$name,recno)==-1} {$base.$name:movefirst}}"
         eval "proc $base.$name:movelast {} {global datasets ; set datasets($base.$name,recno) \[expr \[$base.$name:nrecords\] -1\]}"
-        eval "proc $base.$name:updatecontrols {} {global datasets ; set i 0 ; foreach fld \$datasets($base.$name,fields) {catch {upvar $base.$name.\$fld dbvar ; set dbvar \[lindex \[pg_result \$datasets($base.$name) -getTuple \$datasets($base.$name,recno)\] \$i\]} ; incr i}}"
+        eval "proc $base.$name:updatecontrols {} {\
+               global datasets tup$basewp$name ;\
+               set i \$datasets($base.$name,recno) ;\
+               foreach fld \$datasets($base.$name,fields) {\
+                       catch {\
+                               upvar $basewp$name\(\$fld\) dbvar ;\
+                               set dbvar \$tup$basewp$name\(\$i,\$fld\) ;\
+                       }\
+               }\
+        }"
+        eval "proc $base.$name:clearcontrols {} {\
+               global datasets ;\
+               catch { foreach fld \$datasets($base.$name,fields) {\
+                       catch {\
+                               upvar $basewp$name\(\$fld\) dbvar ;\
+                               set dbvar {} ;\
+                       }\
+               }}\
+        }"
     }
     radio {
-        radiobutton  $base.$name -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* -text "$fdobj($item,l)" -variable "$fdobj($item,v)" -borderwidth 1
+        radiobutton  $base.$name -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* -text "$fdobj($item,l)" -variable "$fdobj($item,v)" -value "$name" -borderwidth 1
         set wh {}
     }
     entry {
@@ -877,7 +937,11 @@ switch $fdobj($item,t) {
        set var {} ; catch {set var $fdobj($item,v)}
        if {$var!=""} {$base.$name configure -textvar $var}
     }
-    listbox {listbox $base.$name -borderwidth 1 -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-*}
+    listbox {
+       listbox $base.$name -borderwidth 1 -background white  -highlightthickness 0 -selectborderwidth 0 -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* -yscrollcommand [subst {$base.sb$name set}]
+       scrollbar $base.sb$name -borderwidth 1 -command [subst {$base.$name yview}] -orient vert  -highlightthickness 0
+       eval [subst "place $base.sb$name -x [expr [lindex $coord 2]-14] -y [expr [lindex $coord 1]-1] -width 16 -height [expr 3+[lindex $coord 3]-[lindex $coord 1]] -anchor nw -bordermode ignore"]
+    }
 }
 if $visual {eval [subst "place $base.$name  -x [expr [lindex $coord 0]-1] -y [expr [lindex $coord 1]-1] -anchor nw $wh -bordermode ignore"]}
 }
@@ -2565,7 +2629,7 @@ proc vTclWindow.about {base} {
     label $base.l2  -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-*  -relief groove  -text {A Tcl/Tk interface to
 PostgreSQL
 by Constantin Teodorescu} 
-    label $base.l3  -borderwidth 0  -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-*  -relief sunken -text {vers 0.82}
+    label $base.l3  -borderwidth 0  -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-*  -relief sunken -text {vers 0.83}
     label $base.l4  -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-*  -relief groove  -text {You will always get the latest version at:
 http://www.flex.ro/pgaccess
 
@@ -2883,7 +2947,7 @@ proc vTclWindow.iew {base} {
                tk_messageBox -title Information -message "Operation completed!"
                Window destroy .iew
        }
-        cursor_arrow .iew
+        catch {cursor_arrow .iew}
 }}  -padx 9  -pady 3 -text Export 
     button $base.cancelbtn  -borderwidth 1 -command {Window destroy .iew}  -padx 9  -pady 3 -text Cancel 
     checkbutton $base.oicb  -borderwidth 1  -text {with OIDs} -variable oicb 
diff --git a/src/bin/pgaccess/specialchars.html b/src/bin/pgaccess/specialchars.html
new file mode 100644 (file)
index 0000000..b6b82f2
--- /dev/null
@@ -0,0 +1,47 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
+<HTML>
+<HEAD>
+   <TITLE>Special locale characters</TITLE>
+   <META NAME="GENERATOR" CONTENT="Mozilla/3.04Gold (X11; I; Linux 2.0.32 i586) [Netscape]">
+</HEAD>
+<BODY TEXT="#000000" BGCOLOR="#FFFFFF" LINK="#0000EF" VLINK="#51188E" ALINK="#FF0000">
+
+<H1>Special locale characters and PgAccess 
+<HR WIDTH="100%"></H1>
+
+<P>The problem is related with some special characters used in different
+countries because PgAccess did not use fonts with `-ISO8859-1' encoding
+-- </P>
+
+<P>The sollution was proposed by H.P.Heidinger ( hph@hphbbs.ruhr.de) and
+it's very simple.</P>
+
+<P>If you look into PgAccess, you will find fonts declared as follows :</P>
+
+<P><TT>$ grep -e '-font' -i pgaccess.tcl<BR>
+-font -Adobe-Helvetica-Medium-R-Normal--*-120-*-*-*-*-*-* \<BR>
+-font -Adobe-Helvetica-Medium-R-Normal--*-120-*-*-*-*-*-* \<BR>
+-font -Adobe-Helvetica-Medium-R-Normal--*-120-*-*-*-*-*-* \<BR>
+-font -Adobe-Helvetica-Medium-R-Normal--*-120-*-*-*-*-*-* \</TT></P>
+
+<P>It should be something like: -adobe-helvetica-medium-r-normal-*-*-120-*-*-*-*-iso8859-1</P>
+
+<P>You can achieve this by running the following script :</P>
+
+<P><TT>#!/bin/sh<BR>
+cp pgaccess.tcl pgaccess.tcl-org<BR>
+cat pgaccess.tcl |\<BR>
+sed -e's/\-\*\-\*\ /\-iso8859\-1\ /g' |\<BR>
+sed -e's/\-\*\-\*\}/\-iso8859\-1}/g' |\<BR>
+sed -e's/\-\*\-\*\]/\-iso8859\-1]/g' |\<BR>
+sed -e's/\-\*\-\*$/\-iso8859\-1/g' |\<BR>
+sed -e's/\-Clean\-/\-Fixed\-/g' |\<BR>
+sed -e's/clean/fixed/g' &gt;pgaccess.iso<BR>
+mv pgaccess.iso pgaccess.tcl<BR>
+chmod +x pgaccess.tcl</TT></P>
+
+<P>The final version of PgAccess (1.0) will let the user decide what fonts
+will be used through a &quot;preferences&quot; dialog window.</P>
+
+</BODY>
+</HTML>