Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
P
Postgres FD Implementation
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Abuhujair Javed
Postgres FD Implementation
Commits
9c93fa2e
Commit
9c93fa2e
authored
Mar 29, 1998
by
Marc G. Fournier
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Upgrade to v0.86
parent
748fab8d
Changes
6
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
307 additions
and
283 deletions
+307
-283
src/bin/pgaccess/README.pga
src/bin/pgaccess/README.pga
+15
-15
src/bin/pgaccess/formdemo.sql
src/bin/pgaccess/formdemo.sql
+16
-3
src/bin/pgaccess/forms.html
src/bin/pgaccess/forms.html
+126
-134
src/bin/pgaccess/index.html
src/bin/pgaccess/index.html
+100
-97
src/bin/pgaccess/pga-rad.html
src/bin/pgaccess/pga-rad.html
+4
-4
src/bin/pgaccess/pgaccess.tcl
src/bin/pgaccess/pgaccess.tcl
+46
-30
No files found.
src/bin/pgaccess/README.pga
View file @
9c93fa2e
---------------------------------------------------------------------------
Copyright (c) 1994-7 Regents of the University of California
Permission to use, copy, modify, and distribute this software and its
...
...
@@ -21,10 +19,10 @@ AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATIONS TO
PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
---------------------------------------------------------------------------
PGACCESS 0.83 11 March 1998
PGACCESS 0.86 29 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
...
...
@@ -38,15 +36,15 @@ First of all because PostgreSQL lacks a graphical interface where you
can manage your tables, edit them, define queries, sequences and
functions.
I use Tcl/Tk because it's a powerful
l
language, and it took me only
I use Tcl/Tk because it's a powerful language, and it took me only
four days of hard work to get it as you see it now.
2.How to INSTALL ?
You will need Tcl/Tk package, I am using now Tcl 7.6 and Tk 4.2.
There
are some problems running under Tcl/Tk 8.0 but I will soon fix them.
You will need Tcl/Tk package, I am using now Tcl 7.6 and Tk 4.2.
PgAccess is running also on Tcl/Tk 8.0
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
...
...
@@ -65,7 +63,9 @@ go for it.
You run it with the command:
wish -f pgaccess.tcl
wish -f pgaccess.tcl [database]
[database] is optional.
Another way of loading the PostgreSQL library is running it with pgwish.
It's a wish compiled with libpgtcl library so it could understand the
...
...
@@ -82,7 +82,7 @@ pgaccess.tcl file.
- Saves preferences in ~/pgaccessrc file
Tables
- opening tables for view
e
ing, max 200 records
- opening tables for viewing, max 200 records
- column resizing by dragging the vertical grid lines
- text will wrap in cells now
- dynamic row height when editing
...
...
@@ -93,7 +93,7 @@ Tables
- editing in place, double click the text you want to change
- record deleting , point the record, press Del key
- adding new records ,save new row with right-button-click on table for the moment
- table generator assistant
lizzard :-) (not wizzard)
- table generator assistant
- table renaming and deleting (dropping)
- table information retrieving : owner, field information, indexes
...
...
@@ -102,7 +102,7 @@ Queries
- save view layout
- can store queries as views
- execution of queries
- view
e
ing of select type queries result
- viewing of select type queries result
- running action queries (insert, update, delete)
- visual query builder with drag & drop support, table aliasing
...
...
@@ -128,7 +128,7 @@ Reports
Forms
- open user defined forms
- form design module available
- query widget allowing access to a recordset
- query widget allowing access to a record
set
Scripts
- define, modify and call user defined scripts
...
...
@@ -137,17 +137,17 @@ Scripts
- table design (add new fields, renaming, etc)
- sequence and function renaming
- more powerful
l
report generator and viewer
- more powerful report generator and viewer
- help on line
6. How you should report the errors?
First of all : operating system, PostgreSQL version,Tcl/Tk version.
A more detailed story of what have you done when error had occured.
A more detailed story of what have you done when error had occur
r
ed.
Tcl/Tk stops usually with a error message and there is a button there
"Stack Trace" and if you press it, you will see a detailed information
about the place where it stuck
s
. Please send it to me.
about the place where it stuck. Please send it to me.
Some information about table structure, no. of fields, records would
be also good.
...
...
src/bin/pgaccess/formdemo.sql
View file @
9c93fa2e
...
...
@@ -5,13 +5,22 @@ CREATE TABLE pga_reports (reportname varchar(64), reportsource text, reportbody
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
;
Query
that
can
be
saved
as
view
S
select
*
from
phonebook
where
continent
=
'usa'
\
.
COPY
pga_forms
FROM
stdin
;
A
simple
demo
form
asdf
14
{
1
2
3
4
5
6
7
8
9
10
11
12
13
14
}
377
x315
+
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} {}}
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:fill .pb.allnames name
\
bind .pb.allnames <ButtonRelease-1> {
\
set ancr [.pb.allnames curselection]
\
if {$ancr!=""} {
\
\
.pb.qs:moveto $ancr
\
\
.pb.qs:updatecontrols
\
}
\
}} Find {}} {button button9 {159 276 229 302} {.pb.qs:close
\
.pb.qs:clearcontrols
\
set nrecs {}
\
set what {}
\
...
...
@@ -46,7 +55,6 @@ tk_messageBox -title Information -message "A new record has been added!"\
#
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
\
...
...
@@ -69,9 +77,14 @@ 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
Ngbendu
Wazabanga
34577345
f
africa
Victor
Ciorbea
634567
Bucuresti
f
europe
Mugabe
Kandalam
7635745
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
Usaisti
5
name
phone_nr
city
company
continent
150
150
150
150
150
q1
5
name
phone_nr
city
company
continent
150
150
150
150
150
view_saved_from_that_query
5
name
phone_nr
city
company
continent
150
150
150
150
150
\
.
src/bin/pgaccess/forms.html
View file @
9c93fa2e
<!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/
3.04Gold
(X11; I; Linux 2.0.32 i586) [Netscape]"
>
<META
NAME=
"GENERATOR"
CONTENT=
"Mozilla/
4.04 [en]
(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>
<P>
<HR
WIDTH=
"100%"
></P>
<HR
WIDTH=
"100%"
>
<P>
This version (0.83) of PgAccess has changed a little the visual form
builder introduced since 0.82 version : variable handling, query
-
results
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>
your own forms.
<P>
For the moment, it has only some basic widgets : labels, entries, buttons
, listboxes , checkboxes and radiobuttons.
</P>
, listboxes , checkboxes and radiobuttons.
<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>
a query results.
<P><B>
How do you generate widgets :
</B>
<OL>
<LI>
select a widget from the toolbox by clicking the appropriate radiobutton
</LI>
<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>
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>
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>
<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>
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>
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>
in the edit field after changing a value in order to be accepted.
<P>
You can also move items by dragging them or delete them by pressing
Del key after selecting them.
</P>
Del key after selecting them.
<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>
.
</P>
</FONT></TT></B>
and
<B><TT><FONT
SIZE=
+1
>
Variable
</FONT></TT></B>
.
<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 button is pressed.
<P>
The field
<B><TT><FONT
SIZE=
+1
>
Variable
</FONT></TT></B>
have
<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>
0.82 used 0 and 1).
<P>
For radiobuttons, it is usual to assign th
e
same
variable to the same radiobuttons within the same group. That variable
<P>
For radiobuttons, it is usual to assign the sam
e
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
them, they will assign their names to global variable.
<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 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>
<BR>
If you want to close the form in run-time you have to issue the command
<B><TT>
destroy .mf
</TT></B>
<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
t
he following procedures and functions :
</P>
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 access
t
o the following procedures and functions :
<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 th
e
designed form that have a particular name (I'll explain later)
<BR>
<B
><TT>
.mf.qry:clearcontrols
</TT></B>
- clear the variables inside th
e
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
th
at field in the current queryresult
<BR>
<B><TT>
.mf.qry:close
</TT></B>
- close the connection (
<B><FONT
COLOR=
"#FF0000"
>
if
query (returns nothing)
<B
R><B><TT>
.mf.qry:setsql newsql
</TT></B>
- set the command query that
will be executed at the next
<B><TT>
.mf.qry:open
</TT></B
>
<BR><B><TT>
.mf.qry:nrecords
</TT></B>
- returns the number of records in
the selected query
<B
R><B><TT>
.mf.qry:crtrecord
</TT></B>
- returns the current record number
inside the query result
<B
R><B><TT>
.mf.qry:fields
</TT></B>
- returns a list of the fields in the
result set
<B
R><B
><TT>
.mf.qry:movefirst
</TT></B>
- move the cursor to the first record
in the recordset
<
BR><B><TT>
.mf.qry:movelast
</TT></B><TT
>
,
<B>
.mf.qry:movenext
</B>
,
<B>
.mf.qry:moveprevious
</B>
</TT>
- moves the cursor there
<B
R><B><TT>
.mf.qry:moveto newrecno
</TT></B>
- move the cursor to that new
record number (first is 0)
<B
R><B><TT>
.mf.qry:updatecontrols
</TT></B>
- update the variables insid
e
the designed form that have a particular name (I'll explain later)
<B
R><B><TT>
.mf.qry:clearcontrols
</TT></B>
- clear the variables insid
e
the designed form binded to a query result
<
BR><B><TT>
.mf.qry:fill listbox field
</TT></B><TT>
</TT>
- fill the named
listbox (whole widget name as
<B><TT>
.mf.listbox1
</TT></B>
) with the all
th
e values of that field in the current queryresult
<B
R><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>
SQL command and open it again. That will be done automatically.
<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>
<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>
will have to name their associate variable like that :
<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 internal name of the form (without
the leading point) and merge it with the query-widget name and you will
get a associative array name. 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><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>
it might be possible to abandon that naming convention .
<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
>
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>
You should find a single table called
"
phonebook
"
a form called
"
Phone book
"
and another
"
A simple demo form
"
.
</P>
<P>
You should find a single table called
"phonebook" a form called "Phone
book" and another "A simple demo form".
<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>
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>
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><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
...
...
@@ -194,31 +188,29 @@ 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>
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>
There is in the demo database also another simple form called
"
A
simple demo form
"
. It will show you how to handle variables from checkboxe
s,
radiobuttons, how to use listboxes, open another forms and so on. I think
they will help you.
</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, radiobutton
s,
how to use listboxes, open another forms and so on. I think they will help
you.
<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 )
</P>
(user defined form 0 , 1 )
<P>
<HR
WIDTH=
"25%"
></P>
<P>
Please feel free to send me your oppinion at
<B>
teo@flex.ro
</B>
on forms
designing and usage.
</P>
<HR
WIDTH=
"25%"
>
<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>
<P>
Please feel free to send me your opinion at
<B>
teo@flex.ro
</B>
on forms
designing and usage.
<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 !
</FONT></B>
<BR><B><FONT
SIZE=
+1
>
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>
</BODY>
</HTML>
src/bin/pgaccess/index.html
View file @
9c93fa2e
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
<HTML>
<HEAD>
<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]"
>
<META
NAME=
"GENERATOR"
CONTENT=
"Mozilla/4.04 [en] (X11; I; Linux 2.0.32 i586) [Netscape]"
>
<TITLE>
PgAccess - a Tcl/Tk PostgreSQL interface
</TITLE>
</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>
<P>
<HR></P>
<HR>
<P>
This program is protected by the following
<A
HREF=
"copyright.html"
>
copyright
</A>
</P>
<LI>
<A
HREF=
"pgaccess-0.86.tar.gz"
>
Download the last version of PgAccess (press
shift and click this link)
</A>
.
</LI>
<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.86 , 29 March 1998 !
<BR>
<BR>
<CENTER><TABLE
BORDER=
3
CELLSPACING=
0
CELLPADDING=
0
WIDTH=
"100%"
BGCOLOR=
"#FFB6C1"
>
<TR>
<TD>
<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>
<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>
</TD>
</TR>
</TABLE></CENTER>
<H3><FONT
COLOR=
"#000080"
>
Installation problems
</FONT></H3>
<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>
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
<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>
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
<H3>
<FONT
COLOR=
"#191970"
>
What does PgAccess now!
</FONT></H3>
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>
<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 spac
e
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 TO
DO list!
<BR>
- table design (add new fields, renaming, etc.)
</P>
<P>
</P>
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 tabl
e
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
<B
R><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
>
<B
R><B>
Sequences
</B
>
<BR>
- defines sequences, delete them and inspect them
<B
R><B>
Functions
</B
>
<BR>
- define, inspect and delete functions in SQL language
<B
R><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
<B
R><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
<B
R><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 TO
-DO list!
<BR>
- table design (add new fields, renaming, etc.)
<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>
</P>
to e-mail to :
<A
HREF=
"mailto:teo@flex.ro"
>
teo@flex.ro
</A>
<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>
.
</P>
you will find how to subscribe to this mailing list
</A>
.
<P>
<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 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.
</P>
<P>
However, the application should work without problems!
</P>
<HR>
<H1>
More information about libpgtcl - downloads
</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 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
<B><A
HREF=
"lib-pg63-redhat42.tar.gz"
>
from
here
</A></B>
libpgtcl.so and libpq.so compiled for PostgreSQL 6.3
version running on a Linux RedHat 4.2 i386 systems. Just copy libpgtcl.so
and libpq.so into your system library directory (/usr/lib or /lib) and
go for it.
<P>
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! I do not recommend this one.
<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.
<P>
However, the application should work without problems!
</BODY>
</HTML>
src/bin/pgaccess/pga-rad.html
View file @
9c93fa2e
...
...
@@ -25,12 +25,12 @@ invoked.
<P>
This mechanism and the extremely versatile scripting mode
of Tcl/Tk would give PgAccess a great power for creating end user application
using Pos
greSQL. The most important thing is that the user could call procedures
and functions that I have used for building up PgAccess !
using Pos
tgreSQL. The most important thing is that the user could call
procedures
and functions that I have used for building up PgAccess !
<H3>
Forms
</H3>
Forms are used for creating windows and placing widgets inside
it. When PgAccess interpre
e
t them, a new window appear, with buttons as
it. When PgAccess interpret them, a new window appear, with buttons as
defined that could call "user defined scripts", "user defined procedures"
or "internal PgAccess procedures".
<BR>
Forms can hold all the widgets allowed in Tcl/Tk , buttons,
...
...
@@ -45,7 +45,7 @@ You can define your own procedures inside a script called "Library" for
example. You can call your procedures from within another script, from
another procedure.
<BR>
The most important thing is that you have total access
to the PgAccess
's
core of functions and procedures used by me in building
to the PgAccess core of functions and procedures used by me in building
PgAccess as an application. Just write
<B><TT><FONT
COLOR=
"#000080"
>
open_table
"Your sample table"
</FONT></TT></B>
and you'll see the result.
<BR>
If you are writing a script called "Autoexec" then it
...
...
src/bin/pgaccess/pgaccess.tcl
View file @
9c93fa2e
...
...
@@ -181,7 +181,7 @@ global dbc
cursor_watch .dw
.dw.lb delete 0 end
catch
{
pg_select $dbc
"select
*
from pga_forms order by formname"
rec
{
pg_select $dbc
"select
formname
from pga_forms order by formname"
rec
{
.dw.lb insert end $rec
(
formname
)
}
}
...
...
@@ -1627,6 +1627,8 @@ if {$flag} {
proc
{
open_table
}
{
objname
}
{
global mw sortfield filter tablename
set sortfield
{}
set filter
{}
Window show .mw
set tablename $objname
mw_load_layout $objname
...
...
@@ -2415,7 +2417,7 @@ catch {
}
proc
{
show_error
}
{
emsg
}
{
tk_messageBox -title Error -icon error -message $emsg
tk_messageBox -title Error -icon error -message $emsg
}
proc
{
show_table_information
}
{
tblname
}
{
...
...
@@ -2542,15 +2544,20 @@ global pref newdbname newpport newhost dbc
load libpgtcl.so
catch
{
draw_tabs
}
load_pref
if
{
$pref
(
autoload
)
&&
(
$pref
(
lastdb
)
!=
""
)}
{
set newdbname $pref
(
lastdb
)
set newhost $pref
(
lasthost
)
set newpport $pref
(
lastport
)
open_database
if
{
$argc
>0
}
{
set newdbname
[
lindex $argv 0
]
set newhost localhost
set newpport 5432
open_database
}
elseif
{
$pref
(
autoload
)
&&
(
$pref
(
lastdb
)
!=
""
)}
{
set newdbname $pref
(
lastdb
)
set newhost $pref
(
lasthost
)
set newpport $pref
(
lastport
)
open_database
}
wm protocol .dw WM_DELETE_WINDOW
{
catch
{
pg_disconnect $dbc
}
exit
}
catch
{
pg_disconnect $dbc
}
exit
}
}
proc
{
Window
}
{
args
}
{
...
...
@@ -2629,7 +2636,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.8
3
}
label $base.l3 -borderwidth 0 -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* -relief sunken -text
{
vers 0.8
6
}
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
...
...
@@ -3401,9 +3408,8 @@ proc vTclWindow.qb {base} {
}
else
{
set qcmd
[
.qb.text1 get 1.0 end
]
regsub -all
"
\n
"
$qcmd
" "
qcmd
regsub -all
"'"
$qcmd
"''"
qcmd
if
{
$qcmd
==
""
}
then
{
show_error
"This query has no commands ?"
show_error
"This query has no commands ?"
}
else
{
if
{
[
lindex
[
split
[
string toupper
[
string trim $qcmd
]]]
0
]
==
"SELECT"
}
{
set qtype S
...
...
@@ -3411,6 +3417,7 @@ proc vTclWindow.qb {base} {
set qtype A
}
if
{
$cbv
}
{
tk_messageBox -message
"create view
$queryname
as
$qcmd
"
set retval
[
catch
{
set pgres
[
pg_exec $dbc
"create view
$queryname
as
$qcmd
"
]}
errmsg
]
if
{
$retval
}
{
show_error
"Error defining view
\n\n
$errmsg
"
...
...
@@ -3419,34 +3426,43 @@ proc vTclWindow.qb {base} {
Window destroy .qb
}
}
else
{
cursor_watch .qb
set retval
[
catch
{
regsub -all
"'"
$qcmd
"''"
qcmd
cursor_watch .qb
set retval
[
catch
{
if
{
$queryoid
==0
}
then
{
set pgres
[
pg_exec $dbc
"insert into pga_queries values ('
$queryname
','
$qtype
','
$qcmd
')"
]
}
else
{
set pgres
[
pg_exec $dbc
"update pga_queries set queryname='
$queryname
',querytype='
$qtype
',querycommand='
$qcmd
' where oid=
$queryoid
"
]
}
}
errmsg
]
cursor_arrow .qb
if
{
$retval
}
then
{
show_error
"Error executing query
\n
$errmsg
"
}
else
{
cmd_Queries
if
{
$queryoid
==0
}
{
set queryoid
[
pg_result $pgres -oid
]}
}
}
errmsg
]
cursor_arrow .qb
if
{
$retval
}
then
{
show_error
"Error executing query
\n
$errmsg
"
}
else
{
cmd_Queries
if
{
$queryoid
==0
}
{
set queryoid
[
pg_result $pgres -oid
]}
}
}
catch
{
pg_result $pgres -clear
}
}
}}
-font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* -padx 9 -pady 3 -text
{
Save query definition
}
button $base.execbtn -borderwidth 1 -command
{
Window show .mw
button $base.execbtn -borderwidth 1 -command
{
set qcmd
[
.qb.text1 get 0.0 end
]
regsub -all
"
\n
"
$qcmd
" "
qcmd
set mw
(
layout_name
)
$queryname
mw_load_layout $queryname
set mw
(
query
)
$qcmd
set mw
(
updatable
)
0
set mw
(
isaquery
)
1
mw_select_records $qcmd
}
-font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* -padx 9 -pady 3 -text
{
Execute query
}
regsub -all
"
\n
"
[
string trim $qcmd
]
" "
qcmd
if
{[
lindex
[
split
[
string toupper $qcmd
]]
0
]
!=
"SELECT"
}
{
if
{[
tk_messageBox -title Warning -message
"This is an action query!
\n\n
Execute it?"
-type yesno -default no
]
==
"yes"
}
{
sql_exec noquiet $qcmd
}
}
else
{
Window show .mw
set mw
(
layout_name
)
$queryname
mw_load_layout $queryname
set mw
(
query
)
$qcmd
set mw
(
updatable
)
0
set mw
(
isaquery
)
1
mw_select_records $qcmd
}
}
-font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* -padx 9 -pady 3 -text
{
Execute query
}
button $base.termbtn -borderwidth 1 -command
{
.qb.cbv configure -state normal
set cbv 0
set queryname
{}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment