Update Pgaccess to 0.83
This commit is contained in:
parent
c24ed70193
commit
8175eb3485
@ -24,7 +24,7 @@ PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
|
||||
|
||||
|
||||
|
||||
PGACCESS 0.82 1 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
|
||||
|
77
src/bin/pgaccess/formdemo.sql
Normal file
77
src/bin/pgaccess/formdemo.sql
Normal file
@ -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
|
||||
\.
|
@ -1,105 +1,224 @@
|
||||
<!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 query widget that allows you yo have access to a query
|
||||
results.
|
||||
<P>Also there is a pseudo query widget that allows you yo have access to
|
||||
a query results. </P>
|
||||
|
||||
<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><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>
|
||||
|
||||
<LI>release the mouse-button </LI>
|
||||
</OL>
|
||||
|
||||
<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.
|
||||
the button is pressed. </P>
|
||||
|
||||
<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> 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>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>
|
||||
<P> 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> 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>. </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 </TT></B>
|
||||
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 :
|
||||
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><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>)
|
||||
<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 :
|
||||
will have to name their associate variable like that : </P>
|
||||
|
||||
<P><TT>.mf.qry.salary</TT> to get the "salary" field , or <TT>.mf.qry.name</TT>
|
||||
to get the "name" field.
|
||||
<P><B><TT>mfqry(salary)</TT></B> to get the "salary" field ,
|
||||
or <B><TT>mfqry(name)</TT></B> to get the "name" 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>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.
|
||||
<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 <formdemo.sql</TT></B></P>
|
||||
|
||||
<P>You should find a single table called "phonebook" a form called
|
||||
"Phone book" and another "A simple demo form".</P>
|
||||
|
||||
<P>First of all enter and view the phonebook table in table view. Note
|
||||
the fields and their values.<BR>
|
||||
Open the "Phone book" form and enter a letter (a, e or i) in
|
||||
the field to the left of "Find" 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 "name" 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 "New" button in order
|
||||
to get new, clean entries. Fill them with your data and press "Add
|
||||
new" 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 "Update" 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 "Phone book" 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 "A
|
||||
simple demo form". 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 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 ! THE
|
||||
FORM API WILL CHANGE IN ORDER TO BE MORE SIMPLE AND BETTER! 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>
|
||||
|
@ -1,118 +1,130 @@
|
||||
<!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>
|
||||
</P>
|
||||
|
||||
<P>Latest version of PgAccess is 0.82 , 1 March 1998 !
|
||||
<BR>
|
||||
<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>.
|
||||
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>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 & 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><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>
|
||||
- visual query builder with drag & 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>On the TODO list! <BR>
|
||||
- table design (add new fields, renaming, etc.) </P>
|
||||
|
||||
<P>
|
||||
<P> </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 </A>
|
||||
to e-mail to : <A HREF="mailto:teo@flex.ro">teo@flex.ro </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>
|
||||
|
@ -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
|
||||
|
47
src/bin/pgaccess/specialchars.html
Normal file
47
src/bin/pgaccess/specialchars.html
Normal file
@ -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' >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 "preferences" dialog window.</P>
|
||||
|
||||
</BODY>
|
||||
</HTML>
|
Loading…
x
Reference in New Issue
Block a user