CA2137167C - Data management method and architecture - Google Patents

Data management method and architecture

Info

Publication number
CA2137167C
CA2137167C CA002137167A CA2137167A CA2137167C CA 2137167 C CA2137167 C CA 2137167C CA 002137167 A CA002137167 A CA 002137167A CA 2137167 A CA2137167 A CA 2137167A CA 2137167 C CA2137167 C CA 2137167C
Authority
CA
Canada
Prior art keywords
hwnd
dbproc
batch
desktop
idm
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Expired - Lifetime
Application number
CA002137167A
Other languages
French (fr)
Other versions
CA2137167A1 (en
Inventor
Tony J. Brice
Richard J. Drexel, Iii
Curtis A. Mitchell
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Sabre GLBL Inc
Original Assignee
American Airlines Inc
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by American Airlines Inc filed Critical American Airlines Inc
Publication of CA2137167A1 publication Critical patent/CA2137167A1/en
Application granted granted Critical
Publication of CA2137167C publication Critical patent/CA2137167C/en
Anticipated expiration legal-status Critical
Expired - Lifetime legal-status Critical Current

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06QINFORMATION AND COMMUNICATION TECHNOLOGY [ICT] SPECIALLY ADAPTED FOR ADMINISTRATIVE, COMMERCIAL, FINANCIAL, MANAGERIAL OR SUPERVISORY PURPOSES; SYSTEMS OR METHODS SPECIALLY ADAPTED FOR ADMINISTRATIVE, COMMERCIAL, FINANCIAL, MANAGERIAL OR SUPERVISORY PURPOSES, NOT OTHERWISE PROVIDED FOR
    • G06Q10/00Administration; Management
    • G06Q10/02Reservations, e.g. for tickets, services or events
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06QINFORMATION AND COMMUNICATION TECHNOLOGY [ICT] SPECIALLY ADAPTED FOR ADMINISTRATIVE, COMMERCIAL, FINANCIAL, MANAGERIAL OR SUPERVISORY PURPOSES; SYSTEMS OR METHODS SPECIALLY ADAPTED FOR ADMINISTRATIVE, COMMERCIAL, FINANCIAL, MANAGERIAL OR SUPERVISORY PURPOSES, NOT OTHERWISE PROVIDED FOR
    • G06Q10/00Administration; Management
    • G06Q10/02Reservations, e.g. for tickets, services or events
    • G06Q10/025Coordination of plural reservations, e.g. plural trip segments, transportation combined with accommodation

Abstract

A data management method and architecture that enables users to integrate central reservation system communications with local accounting and reporting functions. More particularly, the present invention comprises a batch scheduling function that automatically executes predetermined batch tasks and distributes the executable load efficiently among available processing resources. The invention provides significant improvements in environments which require access to mass data storage systems such as the central information repositories used in the travel industry.

Description

DATA MANAGEMENT METHOD AND ARCHITECTURE
TECHNICAL FIELD
The present invention relates generally to a data management method and architecture. In particular the present invention relates to a data management method and architecture allowing user-absent execution of scheduled batch tasks and administration of accounting information in environments that typically involve multiple users requiring access to centrally stored data such as the travel industry.

Y
~~'~ _=.~'~
BACKGROUND OF THE INVENTION
The growth of the airline business from the early 1980's to the 1990's has resulted in the proliferation of travel agencies and other travel information groups that require access to large volumes of data in a "real time" environment.
This growth has spurred many technological advancements in central reservation systems (CRS) for the transportation industry and in particular the airline industry. Examples of such systems are the American Airlines Inc.'s SABRE
system, System One, Covia and Worldspan.
As the number of travel agencies and other travel providers has grown, the importance of automating their business practices such as accounting and report generation has also increased. Innovations for the back-office business side of travel providers have grown from calculators, adding machines and manual file systems to very sophisticated accounting software packages which are commonly available in the market place today.
Until the present invention, however, there has not been a successful integration of the a "real time" central reservation system with the modern travel provider back-office accounting and reporting packages taking full advantage of distributed personal computer processing capabilities. For example, the central reservation systems have gone from a relatively small number of mainframe computers to vast multiplexed systems not specifically designed for a given back-office environment. Furthermore, in the past the mainframe computers were almost always connected to "dumb" terminals, i.e. terminals having no independent processing power and incapable of handling any of the accounting and reporting processing.
Beginning in the mid-1980's, the Personal Computer (PC) began replacing the "dumb" terminals, thus making the processing power of the PC available to the travel provider. Until the present invention, however, a method and architecture that could take advantage of the newly available processing power was not available. Most previously developed methods and architectures depended on "dumb" terminals where all the processing takes place in a single computer such as mainframe or minicomputer. The few previous methods and architectures that allowed users to install PC's utilized "dumb" terminal emulation packages to force the PC's to function as "dumb" terminals, again failing to use the available processing power of the PC. Thus, prior methods and architectures did not allow the user to fully utilize the available PC processing power.
Past and present methods and architectures also did not allow the user to realize the full benefits of using PC based applications that access a database, such as a CRS, directly. Instead, prior art products provided some ability to execute a PC "hand-off" function where the user switches between using the "dumb" terminal emulation package to communicate with the CRS and the PC to perform accounting and reporting functions. Should the user require an integration of the CRS communication with the accounting and reporting ~.

functions, however, then an intermediate step is required. Personal productivity and efficiency are much less because intermediate steps must be performed.
While back-office systems for the travel provider have existed for several years, including Agency Data Systems' ADS product; Systems One's Max; World Span's World Ledger 4000 and Travel Data Systems' TDS; each of these systems was implemented on an IBM proprietary AS/400 architecture. Therefore, none of the prior art back-office accounting and reporting systems are easily ported to other architectures or used in connection with other vendor's hardware products.
In addition, the travel providers have to depend on the developer of each architecture to do the necessary programming to port existing back-office accounting and reporting systems to new architectures as they are developed.
The present invention, however, provides an integrated "real-time" CRS
to back-office system that works on any industry supported architecture and is independent of the particular hardware system used. Thus, the present invention allows travel providers to install various hardware devices not offered by the original architectural vendor. Examples of these hardware devices include printers, workstations, DOS based platforms, DOS based network file servers, and similar devices. The openness and flexibility of the present invention permits travel providers to largely solve their own day-to-day operational and information management needs with minimal dependence for additional programming from the original architectural vendor.

a Unlike the prior art methods and architectures, the present invention provides a method and architecture that can distribute reporting functions among available processing resources in a network environment though a batch scheduling system. This provides maximum flexibility to the end user, as each user can now allocate computing power to a given reporting task. Furthermore, the user can designate the most appropriate platform to accomplish a specific reporting task. This feature allows a user who works in a mixed platform environment to maximize the efficiency of each individual platform by allocating it to a suitable task.
Moreover, the batch scheduling system of the present invention enables a high on-line throughput of transactions achieved through a client server system architecture. The client server architecture can operate when application functions are separated logically, and indeed, sometimes physically from the database management functions. Thus, a user can work with a client (the front-end) on his workstation and use resources of the server (the back-end) only when data needs to be accessed. Thus, regardless of the platform on which the database is run, e. g. , UNIX, OS/2, Novell Netware, the same client applications can be accessed without any changes.
Furthermore, in the present invention either the client or server can be changed independently of the other. For example, one database can be moved from a vendor's UNIX system to another, or to an emerging environment like v a Microsoft Windows NT, with no additional programming required for the client applications.
The present invention also provides the ability to process multiple tasks simultaneously not only on the database server, but also on individual workstations. As an example, in one of the preferred embodiments of the present invention, applications are run on an IBM OS/2 operating system and users can execute multiple ad hoc queries, multiple formatted reports, print from third-party software programs, and do accounting data entry all at the same time. In the prior art, these tasks either tied up each workstation reducing productivity or required the submission of an individual executable command to a processor on a minicomputer.
Moreover, the batch scheduling system of the present invention has a preprogrammed reporting capability that allows each workstation to access multiple reports. The user can see the status of a report at any time, still executing, executed or already viewed reports via a video terminal. The user can send one or more copies to a printer, or save it as a file. The user may also create customized versions of each preprogrammed report by developing a template. This template defines the users choice of select criteria and sort field preferences.
In addition to the preprogrammed reporting system, the invention has a report generator system that allows a non-programmer end user to create ..
customized and formatted reports. By merely selecting the columns the user wishes to see, a detailed query is automatically formed that can be executed.
The user can specify select criteria, sort fields, request aggregate functions, sums, minimums, maximums, averages, and create customized headers and footers.
The present invention then allows users to schedule a task to occur automatically at specific dates and times.
Another aspect of the present invention is to provide a batch scheduling system that allows reports to be distributed among the available network resources. Once jobs are scheduled, they are executed on a user defined platform or groups of platforms attached to the network. The user can define the available resources to be allocated to each reporting task, can group resources to work on a given reporting task, and designate the priority of each task, as well as the time and date at which the task will be performed. Unlike the prior art, this aspect of the invention allows for the processing power of each platform on the network to be used to its fullest even when no actual users are present.
The present invention also ties in perfectly with the current trend of most companies to downsize large mainframe and minicomputer systems to smaller network distributed systems. Thus, the present invention provides numerous advantages over prior data management methods and architectures and eliminates many of the deficiencies therein.

_g_ SUMMARY OF THE INVENTION
The present invention relates to a new and novel data management method and architecture. In particular, the present invention comprises a centralized host computer having means for mass storage of data and communication means for communicating to one or more central processing units. In one of the preferred embodiments, the centralized host computer is one of several central reservation systems (CRS) such as SABRE System One, Covia, World Span, or any other similar CRS.
In one of the preferred embodiments of the present invention access to all of the various CRS host computers is included. The central host computer or CRS is connected through a communication channel to a client server architecture which receives the data stream from the CRS system and subsequently manipulates the data stream into a predetermined data structure. Typically a UNIX or equivalent based process receives, manipulates, and stores the data stream on the travel provider's back-office platform.
In addition, the client server platform maintains certain accounting and reporting mechanisms. These mechanisms consist primarily of client specific accounting information, programs for organizing the information, database structures which contain the organized information, and programs for communicating with the CRS as well as the travel provider's Local Area Network (LAN) or its equivalent. In addition, the client server platform may contain i maintenance utilities such as system backup and diagnostics. The LAN itself is the communication platform for the client and server processes.
In one of the preferred embodiments, the travel provider's platform consists of a LAN which may include any number of attached devices such as mini computers, PC's, dedicated workstations, printers, and similar or equivalent devices. These devices are used for imputing and transmitting data to one or more server processes. The devices are also used by the user to perform "real-time" transactions on the CRS. In addition, these devices are used in connection with the distribution option of the batch scheduling system to process reports as well as other local processing tasks which the client may require. It is at the LAN level that accounting processes such as sales entry, cash functions, accounts receivable, reporting, customer statements, accounts payable, interface, the generation of data files, and customized processes or third-party functions occur.

'i ~.~ aj BRIEF DESCRIPTION OF THE DRAWINGS
For a more complete understanding of the present invention and the advantages thereof, reference is now made to the following description in conjunction with the accompanying drawings in which:
FIGURE 1 is a representative diagram of one embodiment of the system architecture of the present invention;
FIGURE lA is a representation of various workstation processes of the present invention;
FIGURE 1B is a representation of various workstation processes of the present invention;
FIGURE 2 is a detailed diagram of one embodiment of the system methodology of the present invention;
FIGURE 3 is a flow chart diagram of the batch scheduling system of the present invention;
FIGURE 4 is a representative screen showing executable functions of the batch scheduling system;
FIGURE 5 is a representative screen showing operation of the batch scheduling system;
FIGURE 6 is a representative screen showing administration of the batch scheduling system;

~p,~ C ~6 FIGURE 7 is a representative screen showing a daily batch scheduling operation; and FIGURE 8 is a representative screen showing the assignment of resources to resource groups.

12 _ ,.,~.
DETAILED DESCRIPTION OF THE EMBODIMENT
The present invention relates to a data management method and architecture. FIGURE 1 shows an overall system architecture 10 comprising of either a single central host computer or central reservation system (CRS) 20 or a plurality of CRS's 30. In one of the preferred embodiments, the CRS 20 or CRS's 30 are the various travel reservation systems or their equivalent. CRS

or CRS's 30 connects to a gateway or communications server 40, or its equivalent. In one of the preferred embodiments, the communications server 40 is a 386-based platform or its equivalent with storage and disk capabilities.
The communications server 40 is an attached device on a Local Area Network (LAN) 50 such as the IBM Token Ring Netware operating under an IBM OS/2 Presentation Manager operating system. Equivalent network and operating systems may be used. Communication server 40 may contain an RTIC board from IBM or any other similar communications board. The gateway or communications server 40 connects to the LAN 50. Typically the LAN 50 is an IBM Token Ring operating under standard Novell Netware network software utilizing TCP/IP. Connected to the LAN 50 is a network file server 60. In one of the preferred embodiments, the file Server 60 is typically a 386 or equivalent based platform, with disk and storage capabilities operating on a token ring network and LAN workplace IBM OS/2 Presentation Manager software with SQL

x i . . .~ '~ ~_ ~j a' Server PC Net-Library. The file server 60 may also contain various application software including third-party software and/or customized software.
Additionally, the system architecture 10 contains at least one client workstation 70 for the input and display of data. It should be readily understood S that a plurality of client workstations 70 may also be used without departing from the true spirit of the present invention. The client workstation 70 is a 386 or equivalent based platform with or without disk and storage capabilities running on a Token Ring Network under the IBM OS/2 Presentation Manager operating system. This client workstation 70 is used by the travel provider end user to perform many of the routine accounting functions and client report generating functions, including data entry and reservation services. In one of the preferred embodiments of the present invention, it is within a client workstation 70 that the batch scheduling system and message communications processing takes place.
The client workstation 70 accounting and client report generating functions can be more readily understood with reference to FIGURE la. Interface 61, which in one of the preferred embodiments is the IBM OS/2 Presentation Manager or a similar or equivalent interface, provides sales entry functions allowing the client a selection of invoicing programs and creation of invoices using data input 72. The client workstation 70 provides cash functions 74 selected from interface 61 and consisting of functions 76 such as receipts, disbursements, adjustments, open item posting, and unpost paid items using data input 75. Client workstation 70 also provides, through interface 61, account receivables functions 77 consisting of functions 79 such as void, transfer, dispute and resolve, queries, as well as creation, modification, deletion and posting a beginning receivable using data input 78.
S Referring to FIGURE lb which shows other functions of client workstation 70 reached through interface 61 are customer statement functions 81, which using data input 82, provides functions 83 such as creation of a statement format, statement setup, statement remarks and specification, and processing, printing, and reprocessing of statements. Client workstation 70, through interface 61, also provides accounts payable functions 84, which using data input 85, provides for specific functions 86 such as creation, modification and voids, mailing address entries, distribution across accounts, and a payable status screen.
Other functions of the client workstation 70 are hotel and car functions 87 which use data input 88 to provide functions 89 such as building, hotel and car properties, identifying key identifiers, and merging of properties.
Although client workstation 70 functions as herein described and detailed in FIGURES la and lb which are illustrative of the preferred embodiments of the present invention, it must be clearly understood that various other configurations of functions could be utilized that embody the true spirit and scope of the present invention, as described herein.

Attached to the LAN 50 of FIGURE 1 is database server 80. In one of the preferred embodiments, the database server 80 is typically a RISC based platform in an UNIX or equivalent operating system in a Token Ring Network with TCP/IP or a 386-based or equivalent platform that has an IBM OS/2 Presentation Manager operating system on the Token Ring with TCP/IP. It is at the database server 80 that the data stream from the CRS 20 or CRS's 30 is parsed, validated, verified, and otherwise manipulated before being accessible on LAN 50.
Typically, a print server 90 is attached to LAN 50, which in one of the preferred embodiments is a 386 based or equivalent platform, with disk capabilities running on the Token Ring Network under the IBM OS/2 Presentation Manager operating system. In addition, print server 90 may have port expansion cards allowing communication to multiple printers 100. Printers 100 are typically Hewlett Packard LaserJet or equivalent type devices capable of printing text and graphics from wordprocessing and reporting applications.
Although system architecture 10 described herein and depicted in FIGURE
1 is one of the preferred embodiments, it must clearly be understood that various other configurations, methods and system architectures could be utilized as long as they have the appropriate memory and communication links as those described herein.

Importantly, system architect 10 of the present invention is designed to be highly scalable. It is designed to be utilized in travel companies ranging from relatively small, i.e. less that 2000 ticket transactions per month, up to large global agencies having over 100,000 ticket transactions per month per database server. TABLE 1 contains a general description of examples of the system architecture configurations based on tickets and volumes.

Volume of Tickets Preferred Hardware Configuration < 2000 1- Network File Server PC (Intel 486DX2 SOmhz, 20 mb of memory, 400+ mb hard disk storage) 10 or less PC workstations (Intel 486SX
25 mhz, 12 mb of memory, 100+ mb hard disk) 1- UNIX-based database engine (Single 25mhz processor, 64 mb of memory, 1.0 gb hard disk storage) < 5000 1- Network File Server PC (Intel 486DX2 SOmhz, 20 mb of memory, 400+ mb hard disk storage) 10 or less PC workstations (Intel 486SX
25 mhz, 12 mb of memory, 100+ mb hard disk) 1- UNIX-based database engine (Single 25mhz processor, 96 mb of memory, 1.5 gb hard disk storage) < 6000 2- Network File Server PC (Intel 486DX2 SOmhz, 20 mb of memory, 400+ mb hard disk storage) 20 or less PC workstations (Intel 486SX
25 mhz, 12 mb of memory, 100+ mb hard disk) 1- UNIX-based database engine (Dual 33mhz processors, 96 mb of memory, 1.5 gb hard disk storage) -~ a ~
~ y3 f y~ a < 10,000 1- Network File Server PC (Intel 486DX2 50mhz, 20 and users mb of memory, 400+ mb hard disk storage) =

< 20 20 or less PC workstations (Intel 486SX
25 mhz, 12 mb of memory, 100+ mb hard disk) 1- UNIX-based database engine (Dual 33mhz processors, 128 mb of memory, 2.0 gb hard disk storage) < 10,000 2 or less Network File Server PC (Intel and 486DX2 user > 20 50mhz, 20 mb of memory, 400 + mb hard disk storage) 50 or less PC workstations (Intel 486SX
25 mhz, 12 mb of memory, 100+ mb hard disk) 1- UNIX-based database engine (Dual 33mhz processors, 128 mb of memory, 3.5 gb hard disk storage) < 30,000 2 or less Network File Server PC (Intel 50mhz, 20 mb of memory, 400+ mb hard disk storage) 50 or less PC workstations (Intel 486SX
25 mhz, 12 mb of memory, 100+ mb hard disk) 1- UNIX-based database engine (Dual 33mhz processors, 384 mb of memory, 6.0 gb hard disk storage) < 50,000 4 or less Network File Server PC (Intel 50mhz, 20 mb of memory, 400+ mb hard disk storage) 100 or less PC workstations (Intel 486SX
25 mhz, 12 mb of memory, 100+ mb hard disk) 1- UNIX-based database engine (Quad 25mhz processors, 512 mb of memory, 15 +
gb hard disk storage) < 100,000 6 or less Network File Server PC (Intel 50mhz, 20 mb of memory, 400+ mb hard disk storage) 250 or less PC workstations (Intel 486SX
25 mhz, 12 mb of memory, 100+ mb hard disk) 1- UNIX-based database engine (Eight 25mhz processors, 7686 mb of memory, 18+
gb hard disk storage) 18 _ ~ ~. E~''~ ~- ~'~ '~
FIGURE 2 is a flow diagram of one embodiment of the architecture of the present invention. Figure 2 illustrates a plurality of the centralized reservation systems (CRS) 32, 34, 36 and 38 that maintain "real time" databases including present availability, fares, city pairs, bookings, destinations, city guides and other travel related information necessary in the travel industry for booking, purchasing, and ticketing passengers for air travel. Other items of travel included in the CRS 32, 34, 36 and 38 include, among other information, hotel fares, car rental fares, cruise directories, and room availability.
Data from the CRS's 30 is sent via communication links 130, 132, 134 and 136 to database server 80 either directly or through a communications server 40 and LAN 50. At database server 80 the data stream is parsed, validated, and otherwise manipulated according to the message types 140, 142, 144 and 146.
The data communication lines 130, 132, 134, 136 connect to the accounting and reporting system database 150 where the message is either validated and stored 152 or modified and rejected 154 as an invalid message.
Again, in one of the preferred embodiments, the accounting and reporting system database 150 typically resides in either a UNIX-based or equivalent platform, or a 386 or equivalent based platform, using an IBM OS/2 Presentation Manager operating system platform capable of interaction with LAN 50.
Also shown in Figure 2 is batch scheduling system 160 which can be more readily understood with reference to FIGURE 3 and the description below.

,1 ~ ~ -.~
a The information in the accounting and reporting database system 150 is communicated through batch scheduling process 160 via communication links 162, 164, 166 and 168 to client workstation 70 where end user functions 170, 180, 190, 200, and 210 are performed. End user functions 170 include typical accounting processes 170 such as accounts receivable, accounts payable, general ledger, cash balances and other typical accounting processes. Utilizing batch scheduling system 160, other end user functions 170 include generating pre-programmed reports 180, generating customized reports 190, generating data hand-off files 200, and processing and customization of third-party functions 210, such as E-Mail, employee personnel records, etc..
Batch scheduling system 160 can be more readily understood with reference to FIGURE 3. FIGURE 3 is a flow diagram of batch scheduling system 160 of the present invention. The batch scheduling system 160 is controlled by the software that resides on database server 80 and network file server 60 of LAN 50 and communicates and transmits data back and forth between the accounting and reporting system database 150 and client workstation 70 utilized by the end user. A source code listing of the representative operational program of the preferred embodiment of the present invention which is utilized in the memory of the processing unit and that operates batch scheduling 160 system is set forth hereafter in TABLE 2. The source code of batch scheduling system 160 is in computer language "C" , but it should be clearly understood that other computer languages and varying structure, sequence and organization of the source code is contemplated within the scope of the present invention.

~************************************************************************
* Copyright (c) 1990) 1991, 1992, 1993 American Airlines * File: BAMENU.H
* System: Batch AGtninistration * Description:
******x*********************************************************x*******~
#define IDM BA 10600 #defineIDMFILE IDMBA 1 +

#define_ EXIT _ BA 2 IDM IDM+

#define_ VIEw _ BA 3 IDM IDM+

#define_ VIENDEFAULT _ BA 4 IDM IDM+

#define_ VIEWHISTORY _ BA 5 IDM IDM+

#define_ VIEWALL _ BA 6 IDM IDM+

#define_ FILTER _ BA 7 IDM IDM+

#defineIOMJOBS _ BA 8 IDM+

~fdefine_ JOBEDIT _ BA 9 IDM IDM+

#define_ JOBSCHEDULE _ BA 10 IDM IDM+

#define_ JOBRESCHED _ BA 11 IDM IDM+

#define_ JOBRUSH _ BA 12 IDM IDM+

#define_ J08200M _ BA 13 IDM IDM+

#define_ JOBNOLD _ BA 14 IDM IDM+

#define_ JOBRESUME _ BA 15 IDM IDM+

#define_ JOBCANCEL IDMBA 16 IDM +

#define_ ADMIN _ BA 17 IDM IOM+

#define_ _ BA 18 IDM IDM+
HORKSTATIONS

#define_ GROUPS IDM_ 19 IDM BA
+

#define_ EXECUTE IDM_ 20 IDM BA
+

#define_ SCHEDULER IDM_ 21 iDM BA
+

#defineIDhIREFUSEJOBS IDM_ 22 BA
+

#define_ ACCEPTJOBS IDM_ 23 IDM BA
+

#define_ STARTSCHED IDM_ 24 IDM BA
+

#define1DM_ IDMBA 25 STOPSCHED +

#defineIDMBA IDM_ 26 HELP BA
+

#defineIDM_ IDM_ 27 _ BA
BA +
HEL
HFH

#defineIDM_ IDM_ 28 _ BA
_ +
BA
HEL
SC
HELPEXTENDED

#define_ _ IDM_ 29 IDM_ BA
_ +

HEL
SC
HELPKEYS

#define_ _ IDM_ 30 IDM_ BA
_ +
HEL
BA
SC
HELPINDEX

#define_ _ IDM_ 31 IDM_ BA
_ +
BA
HEL
ABOUT

#define_ _ IDM_ 32 IDM_ BA
BA DBTIME +

~*********************t**********************************xx********x**x**
* Copyright (c) 1990, 1991, 1992, 1993 American Airlines * File: BAMENURC.H
* System: Batch Administration * Description:
************************************************************************/
MENU IDM BA
C _ SUBMENU ADMIN
"-Admin", IDM
_ C

MENUITEM "-Workstations...",IDM_NORKSTATIONS

MENUITEM "-Groups...",IDM_GROUPS

MENUITEM "-Executables...",IDM_EXECUTE

MENUITEM SEPARATOR

MENUITEM "E-xit\tF3", SC CLOSE, MIS SYSCOMMAND

SUBMENU VIEW
"-VieW", IDM

C

MENUITEM "-Pending/Running")IDM_VIEHDEFAULT " M1A
CHECKED

MENUITE "-History", M
IDM_VIE41HISTORY

MENUITEM "-All", IDM
VIEWALL

MENUITEM SEPARATOR _ MENUITEM "-Set Criteria",IDM_FILTER

SUBMENU IDM JOBS
"-Batches", C

MENUITEM "Edit a Batch", IDM
-List... JOBEDIT

MENU1TEM SEPARATOR _ MENUITEM "Schedule , IDM
a -Batch..." JOBSCHEDULE

MENU1TEM _ "-Edit Selected Schedule", IDM_JOBRESCHED

MENUITEM "R-ush Batch",IDM_JOBRUSH

MENUITEM SEPARATOR

MENUITEM "-Inspect IDM_JOBZOOM
Batch", MENUITEM SEPARATOR

MENUITEM "-Resume Batch",IDM JOBRESUME

MENUITEM "-Stop/Hold IDM JOBHOLD
Batch", MENUITE M SEPARATO R

MENUITEM "Erase 8-atch",IDM_JOBCANCEL

SUBMENU SCHEDULER
"-Scheduler", i MENUITEM "-Refuse Neu IDM_REFUSEJOBS
Batches", MENUITEM "-Accept New IDM ACCEPTJOBS
Batches", MENUITE M SEPARATO R

MENUITEM "-Start Scheduler",IDM STARTSCHED

MENUITEM "Sto-p Scheduler",IDM STOPSCHED

SUBMENU BA HELP
"-Help", IDM

C

MENUITEM "-Help for IDM_BA_HEL_HFH
Help...", MENUITEM "-Extended SC_HELPEXTENDED, MIS_SYSCOMMAND
Help...", MENUITEM "-Keys Help...",SC HELPKEYS, MIS SYSCOMMAND

MENUITEM "Help -index...",SC HELPINDEX, MIS SYSCOMMAND

MENUITE SEPARATO M
R

MENUITEM "-About...", IDM BA HEL ABOUT

MENUITEM "00:00:00", IDM BA D8TIME) MIS BUTTONSEPARATOR MIS TEXT
~************************************************************************
* Copyright (c) 1990, 1991, 1992, 1993 American Airlines * File: BAMENU.H
* System: Batch Administration * Description:
************************************************************************~
#defineIDM_BA 10600 #defineIDMFILE IDMBA 1 +

#define_ EXIT _ BA 2 IDM IDM+

#define_ VIEW _ BA 3 IDM 1DM+

#define_ VIEhIDEFAULT IDMBA 4 IDM +

#define_ VIEHHISTORY _ BA 5 IDM IDM+

#define_ VIEWALL _ BA 6 IDM IDM+

#define_ FILTER _ BA 7 IDM IDM+

#define_ JOBS _ BA 8 IDM IDM+

#define_ JOBEDIT IDMBA 9 IDM +

#define_ JOBSCHEDULE _ BA 10 IDM IDM+

#define_ J08RESCHED _ BA 11 IDM IDM+

#define_ JOBRUSH _ BA 12 IDM IDM+

#define_ JOB200M _ BA 13 IDM IDM+

#define_ JOBHOLD _ BA 14 IDM IDM+

#defineIDM_ IDM_ 15 JOBRESUME BA
+

#defineIDM_ IDM_ 16 JOBCANCEL BA
+

#defineIDM_ IDM_ 17 ADMIN BA
+

#define_ IDM_ 18 NORKSTATIONS +

#defineIDMGROUPS IDM_ 19 BA
+

#defineIDM_ IDM_ 20 EXECUTE BA
+

#defineIDM_ IDM_ 21 SCHEDULER BA
+

#defineIDM_ IDM_ 22 REFUSEJOBS BA
+

#defineIDM_ IDM_ 23 ACCEPTJOBS BA
+

#defineIDM_ IDM_ 24 STARTSCHED BA
+

#defineIDM_ IDM_ 25 STOPSCHED BA
+

#defineIDM_ IDM_ 26 BA BA
HELP +

#defineIDM_ IDM_ 27 _ BA
BA +
HEL
HFH

#defineIDM_ IDM_ 28 _ BA
_ +
BA
HEL
SC
HELPEXTENDED

#defineIDM_ IDM_ 29 _ BA
_ +
_ BA
HEL
SC
HELPKEYS

#defineIDM_ IDM_ 30 _ BA
_ +
_ BA
HEL
HELPINDEX
SC

#defineIDM_ IDM_ 31 _ BA
_ +
_ BA
HEL
ABOUT

#defineIDM_ IDMBA 32 _ +
_ BA DBTIME

~********x*t**x************************w*********************************

x * (c> 1990, 1991, Copyright 1992, 1993 American Airlines * BAMENURC.H
File:

* Batch Administration System:

*
Description:

************************************************************************~

MENU IDM BA
C _ SUBMENU "-Admin", IDM ADMIN

-c MENUITEM "-Workstations...", IDM_hIORKSTATIONS
MENUITEM "-Groups...", IDM GROUPS
MENUITEM "-Executables...", IDM EXECUTE
MENUITEM SEPARATOR
MENUITEM "E-xit\tF3", SC CLOSE, MIS SYSCOMMAND
SUBMENU VIEW
"-VieW", IDM

MENUITEM"-Pending/Running",IDM_ VIENDEFAULT "
MIA CHECKED

MENUITEM"-History", IDM_ VIEwHISTORY

MENUITEM"-All", IDM_ VIEWALL

MENUITEMSEPARATOR

MENUITEM"-Set Criteria",IDM_ FILTER

SUBMENU IDM
"-Batches", JOBS

C

MENUITEM"Edit a Batch ", IDM JOBED1T
-List...

MENUITE M SEPARATO R

MENUITEM"Schedule a , IDM
-Batch..." JOBSCHEDULE

MENUITEM"-Edit Selectedle") _ Schedu IDM_JOBRESCHED

MENUITEM"R-ush Batch", IDM_JOBRUSH

MENUITEMSEPARATOR

MENUITEM"-Inspect Batch", IDM JOBZOOM

MENUITE M SEPARATO R

MENU1TEM"-Resume Batch", IDM_JOBRESUME

MENUITEM"-Stop/Hold IDM_JOBHOLD
Batch", MENUITEMSEPARATOR

MENUITEM"Erase B-atch", IDM JOBCANCEL
_ ) SUBMENU SCHEDULER
"-Scheduler", IDM

C

MENUITEM"-Refuse New IDM REFUSEJ08S
Batches", MENUITEM"-Accept New IDM ACCEPTJOBS
Batches", MENUITE M SEPARATO R

MENUITEM"-Start Scheduler", IDM
STARTSCHED

MENUITEM"Sto-p Scheduler", _ IDM STOPSCHED

"-Help", HELP
IDM

C

MENUITEM"-Help for IDM_BA_HEL_HFH
Help...", MENU(TEM"-Extended SC _HELPEXTENDED, Help...", MIS_SYSCOMMAND

MENUITEM"-Keys Help..."SC HELPKEYS, MIS_SYSCOMMAND

MENUITEM"Help -index...",SC HELPINDEX, MIS
SYSCOMMAND

MENUITE SEPARATO M
R

MENUITEM"-About...", IDM
BA
HEL
ABOUT

"00:00:00", BUTTONSEPARATOR

BA DBTIME, TEXT

) .*********************************************************************x**
Copyright (c) 1990, 1991, 1992, 1993 American Airlines File: BATCH.DEF
System: Batch Administration Description:
2 4 _ ~ x ~ ~ '~_ ~ ..~ v .' ************************************************************************
NAME BATCH NINDOHAPI
DESCRIPTION 'Batch' PROTMODE

~************************************************************************
* Copyright (c) 1990, 1991, 1992) 1993 American Airlines * File: BATCH.DLG
* System: Batch Administration * Description:
************************************************************************~
DLGINCLUDE 1 "dialog. h"
DLGTEMPLATE LOADONCALL MOVEABLE DISCARDABLE
IDD_JOBSTEP

BEGIN

DIALOG "", IDD_JOBSTEP, 7, 5, 408, 198, FS NOBYTEALIGN
~ WS VISIBLE, FCF SYSMENU i FCF TITLEBAR

BEGIN

CONTROL "ADSLBHeading", DID_JOBSTEP_HEADING, 5) 176) 395, 15, "ADSLBHeading", WS_VISIBLE

LISTBOX DID_JOBSTEP_ADSLIST, 5, 78, 395, 95, LS 041NERDRAN ;

LS_HORZSCROLL

LTEXT "-Program Name", 0, 5, 68, 71, 8, DT_MNEMONIC

CONTROL "", DID_JOBSTEP_COMBO, 8, -3) 128, 70, WC_COMBOBOX, CBS_DROPDONNLIST ~ WS_TABSTOP
; WS
VISIBLE

LTEXT _ "-Hidden Parameters", 0, 150, 68, 100, 8, DT_MNEMONIC

ENTRYFIELD "", DID_JOBSTEP_ARGS2, 155, 57, 150, 8, ES_MARGIN

LTEXT "Para-meters", 0, 5, 43, 62, 8, DT_MNEMONIC

ENTRYFIELD "") DIO_JOBSTEP_ARGS1, 10, 32, 295, 8, ES_MARGIN

LTEXT "Restricted:", 0, 330, 58, 65, 8, NOT WS
GROUP

LTEXT _ "", DID_JOBSTEP RESTRICT1, 340, 47, 65, 8, NOT

WS_GROUP

LTEXT "", DID_JOBSTEP RESTRICT2, 340, 36, 65, 8, NOT

WS_GROUP

PUSHBUTTON "-Clear", DID_JOBSTEP_CLEAR, 5, 5, 45, 13, WS_GROUP

PUSHBUTTON "-Append", DID-JOBSTEP APPEND, 55, 5, 45, 13, NOT

WS_TABSTOP

PUSHBUTTON "-Insert", DID JOBSTEP-INSERT, 105, 5, 45, 13, NOT

WS_TABSTOP

PUSHBUTTON "-Modify", DID JOBSTEP UPDATE, 155, 5, 45, 13, NOT

WS_TABSTOP

PUSHBUTTON "-Delete", DID JOBSTEP DELETE, 205, 5, 45, 13, NOT

WS_TABSTOP

PUSHBUTTON "Pass-words...", DID
JOBSTEP PASSHORDS, 255, 5, 65, -13, HOT WS_TABSTOP

PUSHBUTTON "-Cancel", DID OK, 340, 5, 60, END

END

DLGTEMPLATE IDD_PNDENTER LOADONCALL MOVEABLE DISCAROABLE
BEGIN
DIALOG "Enter Password", IDD_PLIDENTER, 75, 75, 172, 44, FS N08YTEALIGN ;
WS VISIBLE, FCF SYSMENU ; FCF TITLEBAR
BEGIN
ENTRYFIELD "", DID_P11DENTER_ENT1) 15, 27, 135, 8, NOT
ES_AUTOSCROLL i ES_MARG1N i ES_UNREADABLE
DEFPUSHBUTTON "Cortmi-t", DID OK, 15, 4, 46, 13 Gd ..i ~:J 1:
PUSHBUTTON "-Cancel", IDI MGLASS1, 105, 4, 49, 13 END
END

DLGTEMPLATE LOADONCALL MOVEABLE DISCARDABLE
IDD_P41DSET

BEGIN

DIALOG "Set rds", IDD_PWDSET, 7, 4, 379, 107, Passwo FS NOBYTEALIGN ;

WS VISIBLE, FCF SYSMENU ; FCF TITLEBAR

BEGI N

GROUPBOX "Restrict -modification of batch", 0, 10, 28, 171, 75, DT_MNEMONIC

LTEXT "Type password here...", 0, 20, 78, 100, 8, NOT

WS GROUP

ENTRYFIELD "", DID_PWDSET ENT1, 25, 67, 136, 8, NOT

ES AUTOSCROLL ; ES MARGIN i ES
UNREADABLE

LTEXT "Retype password here to verify...", 0, 20, 47, 142, 8, NOT WS_GROUP

ENTRYFIELD "", DID_P41DSET ENT2, 25, 36, 136, 8, NOT

ES AUTOSCROLL ~ ES MARGIN ~ ES
UNREADABLE

GROUPBOX "Restrict -scheduling of batch") 0, 195, 28, 171, 75, DT_MNEMONIC

LTEXT "Type password here...", 0, 205, 78, 100, 8, NOT

WS_GROUP

ENTRYFIELD "", D1D_PWOSET ENT3, 210, 67, 136, 8, NOT

ES AUTOSCROLL ; ES MARGIN ; ES
UNREADABLE

LTEXT "Retype password here to verify...", 0, 205, 47, 144, 8, NOT WS
GROUP

ENTRYFIELD _ "", DID_PWDSET ENT4, 210, 36, 136, 8, NOT

ES_AUTOSCROLL ; ES_MARGIN ~ ES_UNREADABLE

DEFPUSHBUTTON"Comni~t", DID OK, 9, 7, 173, 13, WS GROUP ; NOT

WS_TABSTOP

PUSHBUTTON "-Cancel", IDI MGLASS1, 194, 7, 173, 13 END

END

DLGTEMPLATE LOADONCALL MOVEABLE DISCARDABLE
IDD_RESUME

BEGIN

DIALOG "BATCH", IDD_RESUME, 13, 16, 352, 142, ID: FS NOBYTEALIGN ;

WS VISIBLE, FCF SYSMENU ; FCF TITLEBAR

BEGI N

ICON IDI_GOLIGHT, 0, 7, 120, 22, 16, WS
GROUP

LTEXT _ "Last Job Completed:", 0, 41) 128, 99, 8 LTEXT "CURRENT JOB", DID_RESUME_STEPOUT, 150, 128, 20, 8 LTEXT "Return Code from Job:", 0, 41, 118, 103, 8 LTEXT "RETURN CODE", DID RESUME RETURNCODE, 150, 118, 20, LTEXT "Next job:", 0, 180, 128, 50, 8 LTEXT "NEXTJOB", DID_RESUME_NEXTSTEP, 242, 128, 50, 8 LTEXT "Workstation:", 0, 180, 118, 77, 8, NOT WS_GROUP

LTEXT "MACHINE", DID RESUME MACHINE, 242, 118, 77, 8, NOT

WS_GROUP

CONTROL "", 0, 8, 114, 336, 2, WC STATIC, SS-FGNDFRAME ;

WS_VISIBLE

CONTROL "ADSLBHeading", DID_RESUME_HEADING, 8, 98, 336, 15, "ADSLBHeading", WS_GROUP ; WS_VIS18LE

LISTBOX DID_RESUME_ADSL1ST, 8, 24, 336, 72, LS OWNERDRAW ;

LS_HORZSCROLL

AUTOCHECKBOX "Any Workstation in Group", DID_RESUME_ANYINGROUP, 220, 6, 130, 10, WS_GROUP ; NOT
WS TABSTOP

DEFPUSHBUTTO N "GO", DID_OK, 13, 4, 38, 13 PUSHBUTTON "Execute Job", DID_RESUME_STEP, 60, 4, 74, 13 PUSHBUTTON "Cancel", IDI MGLASS1, 144, 4, 43, 13 END

END

DLGTEMPLATE
IDD ZOOM
LOADONCALL
MOVEABLE
DISCARDABLE

~ K"~ ~ ~.~ ~.~

R5 ..~' ~:! 1~

BEGIN

DIALOG "", IDD_ZOOM, 7, 7, 355, 167, FS NOBYTEALIGN
; NS VISIBLE, FC F
SYSMENU ~ FCF TITLEBAR

BEGIN

ICON IDI_MGLASS1, 0, 3, 148, 22, 16 GRO<JPBOX "Status", 0, 8, 74, 52, 74, NOT
WS_GROUP

ICON IDI_MGLASS1, DID_ZOOM_USERRE~, 23, 114, 22, 16 ICON ID1_MGLASS1, DID_ZOOM_STATUS) 23, 89, 22, 16 GROUPBOX "", 0, 66, 74, 281, 74, NOT WS
GROUP

LTEXT _ "Current Job:", 0, 74, 134, 97, 8, NOT NS_GROUP

LTEXT "JOBNUM", DID ZOOM-STEPNUM, 175, 134, 160, 8, NOT

NS_GROUP

LTEXT "Prey Job Result:", 0, 74) 126, 97, 8, NOT WS_GROUP

LTEXT "JOBRESULT") DID ZOOM_STEPRESULT, 175, 126, 160, 8, NOT WS_GROUP

LTEXT "Group Name:", 0, 74, 118, 97, 8, NOT WS_GROUP

LTEXT "GRPNAME", DID 200M_GRPNAME, 175, 118, 160, 8, NOT

WS_GROUP

LTEXT "Machine Name:", 0, 74, 110, 97, 8, NOT WS_GROUP

LTEXT "MACHINENAME", DID ZOOM MACHINENAME, 175, 110, 160, 8, NOT WS_GROUP

LTEXT "Start Time:", 0, 74, 102, 97, 8, NOT uS GROUP

LTEXT "STARTTIME", DID ZOOM_STARTTIME, 175, 102) 160, 8, NOT WS_GROUP

LTEXT "End Time:", 0, 74, 94, 97, 8, NOT WS_GROUP

LTEXT "ENDTIME", DID ZOOM-ENDTIME, 175, 94, 160, 8, NOT

WS_GROUP

LTEXT "Next Run Scheduled:", 0, 74, 86, 97, 8, NOT

WS_GROUP

LTEXT "NEXTRUN") DID ZOOM NEXTRUN, 175, 86, 160, 8, NOT

WS
GROUP

LTEXT _ "Scheduled By:", 0, 74, 78, 97, 8, NOT WS_GROUP

LTEXT "SCHEDBY", DID ZOOM_SCHEDBY, 175, 78, 160, 8, NOT

WS_GROUP

GROUPBOX "Recurring ", 0, 8, 4, 339, 70, NOT WS_GROUP

RTEXT "Day of the Month:", DID ZOOM-PMOFFSET, 16, 33, 80, 8, NOT WS_GROUP

LTEXT "MONTHDAY", DID ZOOM MONTHDAY) 102, 33, 53, 8, NOT

WS_GROUP

GROUPBOX "On Weekdays", 0, 14, 43, 171, 23, HOT WS_GROUP

LTEXT "Sun", DID_ZOOM_SUN, 18, 48, 18, 8, NOT WS_GROUP

LTEXT "Mon", DID_ZOOM_MON, 42, 48, 20, 8, NOT WS_GROUP

LTEXT "Tue", DID_ZOOM_TUE, 68, 48, 17, 8, NOT WS_GROUP

LTEXT "Wed", DID_ZOOM_WED, 91, 48, 21, 8, NOT WS_GROUP

LTEXT "Thu", DID ZOOM_THU, 118, 48, 17, 8, NOT WS_GROUP

LTEXT "Fri", DID_ZOOM_FRI, 141, 48, 12, 8, NOT WS_GROUP

LTEXT ZOOM
SAT, 159, 48) 15, 8, NOT WS_GROUP
"Sat", DID

GROUPBOX _ _ "On Months", 0, 190, 33, 146, 33, NOT WS_GROUP

LTEXT "Jan", DID_ZOOM_JAN, 198) 48, 16, 8, NOT WS_GROUP

LTEXT "Feb", D1D_ZOOM_FEB, 220, 48, 17, 8, NOT WS_GROUP

LTEXT MAR, 243, 48, 18, 8, NOT WS_GROUP
"Mar", DID
ZOOM

LTEXT _ _ "Apr", DID_ZOOM_APR, 2b7, 48, 15, 8) NOT WS_GROUP

LTEXT 200M_MAY, 288, 48, 18, 8, NOT
WS_GROUP
"May", DID

LTEXT _ "Jun", DID_ZOOM_JUN, 312, 48, 16, 8, NOT WS_GROUP

LTEXT JUL, 198, 40, 14, 8, NOT WS_GROUP
"Jul", DID
ZOOM

LTEXT _ _ "Aug", DID_ZOOM_AUG, 220, 40, 17, 8, NOT WS_GROUP

LTEXT "Sep", DID_ZOOM_SEP, 243, 40) 18, 8, NOT WS_GROUP

LTEXT "Oct", DID_ZOOM_OCT, 267, 40, 15, 8, NOT t1S_GROUP

LTEXT "NOV", DID_ZOOM_NOV, 288, 40, 17, 8, NOT WS_GROUP

LTEXT ZOOM_DEC, 312, 40, 18, 8, NOT
WS GROUP
"Dec", DID

DEFPUSHBUTTON _ "Cancel", IDI_MGLASS1, 303, 148, 46) 15 GROUPBOX "On Periods", 2231, 14, 10, 246, LTEXT "1", DID_ZOOM-1, 21, 15, 12, LTEXT "2", DID_ZOOM-2, 39, 15) 12, LTEXT ZOOM 3, 57, 15, 12, 8 "3", DID

LTEXT _ "4", DID_200M 4, 75, 15, 12, LTEXT "5", DID
ZOOM 5, 93, 15, 12, 8 LTEXT _ "6", DID_ZOOM_6, 111, 15, 12, LTEXT "7", DID_ZOOM_7, 129) 15, 12, LTEXT "8", DID_ZOOM 8, 147, 15, 12, LTEXT "9", DID_ZOOM 9, 165, 15, 12, LTEXT "10", DID_ZOOM_10, 183, 15, 12, LTEXT "11", DID_ZOOM_11, 201, 15, 12, LTEXT "12", DID_ZOOM_12, 219, 15, 12, LTEXT "13", DID_ZOOM-13, 237, 15, 12, END

END

IDD_DAYTIMER

BEGIN

DIALOG "ScheduleBatch", IDD_DAYTIMER, 19, 10, a 352, 164, FS NOBYTEALI GN ; WS VISIBLE, FCF SYSMENU
~ FCF TITLEBAR

BEGI N

ICON IDI SCHED1, DID_DAYTIMER_ICON, 10, 142, 22, 16 LTEXT "Run This -BATCH:", 0, 41, 153, 74, 8, DT_MNEMON1C

CONTROL "", DID_DAYT1MER_JOBCOMBO, 41, 77, 160, 75, WC_COM8080X, CBS DROPDOWNLIST
; WS TABSTOP i WS_VISIBLE

LTEXT "On This -GROUP:", 0, 217, 153, 72, 8, DT_MNEMONIC

CONTROL "", DID_DAYTIMER GRPCOMBO, 217, 77, 104, 75) WC_COMBOBOX, CBS DROPDOWNLIST
~ WS TABSTOP i WS_VISIBLE

GROUPBOX "At This Time and Date", 0, 4, 20, 345, 120, NOT

WS_GROUP

AUTOCHECKBOX "-ASAP ", DID
DAYTIMER
ASAP, 11, 120, 43, 10 CONTROL _ _ "", 0, 11, 115, 65) 2, WC STATIC, SS_FGNDFRAME i WS_VISIBLE

LTEXT "-Run Time", DID DAYTIMER STARTTEXT, 11, 104, 42, 8, DT_MNEMONIC

ENTRYFIELD "", DID_DAYTIMER_STARTHOUR, 13, 92, 12, 8, ES RIGHT

NOT ES_AUTOSCROLL i ES_MARGIN

LTEXT ":", DID_DAYTIMER STARTCOLON, 28, 92, 4, 8, NOT

WS_GROUP

ENTRYFIELD "", DID_DAYTIMER_STARTMIN, 34, 92, 12, 8, ES RIGHT i NOT ES AUTOSCROLL ; ES_MARGIN

AUTORADIOBUTTON "am", DID_DAYTIMER AM, 52, 95, 27, 10, WS GROUP ;

WS_TABSTOP

AUTORADIOBUTTON"pn") DID_DAYTIMER_PM, 52, 87, 26, 10 CONTROL "", 0, 11, 77, 65, 2, WC STATIC, SS_FGNDFRAME i WS_VISIBLE

LTEXT "R-un Date") DID DAYTIMER DATETEXT, 11, 64, 41, 8, DT_MNEMONIC

CONTROL "Formatted", DID_DAYTIMER_DATE, 13, 54, 50, 8, "Formatted", WS_TABSTOP ; WS_VISIBLE

PUSHBUTTON "-Now", PBID_NOW, 19, 30, 40, CONTROL "", 0, 80, 23, 2, 109, WC STATIC, SS_FGNDFRAME ;

WS_VISIBLE

LTEXT "Recurring...", 0, 91, 124, 66, 8, NOT WS_GROUP

AUTORADIOBUTTON"By Month", RBID MONTH, 174, 123, 54, 10, WS GROUP

WS_TABSTOP

AUTORADIOBUTTON"By Period", RBID PERI00, 261, 123, 55, 10, WS_TABSTOP

GROUPBOX "-Day") 0, 85, 25, 86, 98) DT_MNEMONIC

LTEXT "... of the Week", 0, 94) 107) 63, 8, NOT NS GROUP

AUTOCHECKBOX "Sun", DID_DAYT1MER_SUN, 89, 95, 31, 10 AUTOCHECKBOX "Mon", D1D_DAYTIMER-MON, 89, 85, 32, 10, NOT

WS_TABSTOP

AUTOCHECKBOX "Tue", DID_DAYTIMER TUE, 89, 75, 32, 10, NOT

WS_TABSTOP

AUTOCHECKBOX "Wed", DID_DAYTIMER WED, 89, 65, 32, 10, NOT

WS_TABSTOP

AUTOCHECKBOX "Thu", DID DAYTIMER THU, 129, 95, 32, 10, NOT

WS_TABSTOP

AUTOCHECKBOX"Fri", DID_DAYTIMER-FRI, 129, 85, 32, 10, NOT

NS_TABSTOP

AUTOCHECKBOX"Sat", DID_DAYTIMER SAT, 129, 75, 32, 10, NOT

NS
TABSTOP

PUSHBUTTON_ "-Daily", DID DAYTIMER DAILY, 129, 61, 35, 13, WS_GROUP

LTEXT "... of the Month", STID DAY
OFFSET, 92, 50, 70, 8, NOT WS_GROUP

AUTOCHECK80X"1st", DID_DAYTIMER_1ST, 89, 40, 32, 10, WS
GROUP

AUTOCHECKBOX_ "Last", DID_DAYTIMER_LAST) 132, 40, 32, 10, NOT

NS_TABSTOP

LTEXT "Other (1-31)", DID DAYTIMER
OTHERTEXT) 89, 29, 53, ENTRYFIELD"", DID_DAYTIMER_OTHERENT, 146, 29, 17, 8, NOT

ES_AUTOSCROLL i ES_MARGIN

GROUPBOX "-Month", -1, 174, 25, 86, 98, DT
MNEMONIC

AUTOCHECKBOX_ "JAN", DID_DAYTIMER_JAN, 180, 102, 31, 10 AUTOCHECKBOX"FEB") DID_DAYTIMER-FEB, 180, 92, 32, 10, NOT

WS_TABSTOP

AUTOCHECKBOX"MAR", DID_DAYT1MER MAR, 180, 82, 34, 10, NOT

WS_TABSTOP

AUTOCHECKBOX"APR", DID_DAYTIMER APR, 180, 72, 32, 10, NOT

WS_TABSTOP

AUTOCHECKBOX"MAY", DID_DAYTIMER MAY, 180) 62, 34, 10, NOT

WS_TABSTOP

AUTOCHECKBOX"JUN", DID_DAYTIMER_JUN) 180, 52, 32, 10, NOT

WS_TABSTOP

AUTOCHECKBOX"JUL", DID_DAYTIMER_JUL, 220, 102, 31, 10) NOT

WS_TABSTOP

AUTOCHECKBOX"AUG", DID_DAYTIMER AUG, 220, 92, 33, 10, NOT

NS_TABSTOP

AUTOCHECKBOX"SEP", DID_DAYTIMER SEP, 220, 82, 32, 10, NOT

WS_TABSTOP

AUTOCHECKBOX"OCT", DID_DAYTIMER OCT, 220, 72, 32, 10, NOT

WS_TABSTOP

AUTOCHECKBOX"NOV", DID_DAYTIMER NOV, 220, 62, 33, 10, NOT

WS_TABSTOP

AUTOCHECKBOX"DEC", DID_DAYTIMER DEC, 220, 52, 33, 10, HOT

WS_TABST~

PUSHBUTTON"-Monthly", DID DAYTIMER ALL, 180, 29, 44, 13, WS_GROUP

GROUPBOX "-Period", 1139, 262, 25, 83, 98, DT_MNEMONIC

AUTOCHECKBOX"1", D1D_DAYTIMER_PERIOD1, 2b7, 102, 19, 10 AUTOCHECKBOX"2", DID_DAYT1MER PERIOD2, 267, 92, 19, 10, NOT

WS_TABSTOP

AUTOCHECKBOX"3", DIO_DAYTIMER PERIOD3, 267, 82, 19, 10, NOT

WS_TABSTOP

AUTOCHECK80X"4", DID_DAYTIMER PERIOD4, 267, 72, 19, 10, NOT

WS_TABSTOP

AUTOCHECKBOX"5", DID_DAYTiMER PERIODS, 267, 62, 19, 10, NOT

wS TABSTOP

AUTOCHECKBOX"6", DID_DAYTIMER PERIODb, 267, 52) 19, 10, NOT

WS_TABSTOP

AUTOCHECKBOX"7", DID_DAYTIMER PERIOD7, 289, 102, 19, 10, NOT

WS_TABSTOP

AUTOCHECKBOX"8", DID_DAYTIMER PERIODB) 289, 92, 19, 10, NOT

WS_TABSTOP

AUTOCHECKBOX"9", DID_DAYTIMER PERIODS, 289, 82) 19) 10, NOT

WS_TABSTOP

AUTOCHECKBOX"10", DID_DAYT1MER PERIOD10, 289, 72, 25, 10, NOT

WS_TABSTOP

AUTOCHECKBOX"11", DID_DAYTIMER PERI0011, 289, 62, 25, 10, NOT

NS_TABSTOP

AUTOCHECKBOX"12", DID_DAYTIMER PERIOD12, 289, 52, 25, 10, NOT

WS TABSTOP

"~,'~ ~~~.~
r,.

END
AUTOCHECKBOX "13", DID DAYTIMER PERIOD13, 311, 102, 25, 10, NOT
WS_TABSTOP
PUSHBUTTON "-Periodically", DID DAYTIMER PERIODICALLY, 267, 28, 61, 14, WS_GROUP
AUTOCHECKBOX "-Hold Batch", DID DAYTIMER HOLD, 36, 4, 65, 10, WS GROUP
DEFPUSHBUTTON "Commi-t", DID_OK, 239, 3, 50, 13, WS_GROUP
PUSHBUTTON "-Cancel", IDI_MGLASS1, 294, 3, 50, 13, NOT
WS TABSTOP
END

IDD_FILTER

BEGIN

DIALOG "Set Criteria", IDD_FILTER, 7, 5, 318, 142, FS
NOBYTEALIGN
;

WS VISIBLE, FCF SYSMENU i FCF TITLEBAR

BEGI N

LTEXT "Batch Name:", 0, 15, 117, 65, CONTROL "JOBNAME", DID_FILTER_JOBCOM80, 87, 46, 152, 80, WC_COMBOBOX, CBS DROPDOWNLIST
~ WS TABSTOP i WS_VISIBLE

PUSHBUTTON "Clear", DID_FILTER_JOBCLEAR, 252, 114, 53, 12 LTEXT "Scheduled By:", 0, 15, 97, 65, 8, NOT WS_GROUP

CONTROL "SCHEDBY", DID_FILTER_BYCOMBO, 87, 26, 152, 80, WC_COMBOBOX, C8S DROPDOWNLIST
( WS TABSTOP ;

WS_V1SIBLE

PUSHBUTTON "Clear", DID_FILTER_BYCLEAR, 252, 94, 53, 12 LTEXT "Target Group:", 0, 15, 77, 65, 8, NOT WS_GROUP

CONTROL "GROUP", DID_FILTER_GROUPCOMBO, 87, 6) 152, 80, WC_COM80BOX, CBS DROPDOWNLIST
; WS TA8STOP ;

WS_VISIBLE

PUSHBUTTON "Clear", DID_FILTER_GROUPCLEAR, 252, 74, 53, 12 GROUPBOX "Scheduled Run Date Range", 0, 13, 30, 293, 32, NOT

WS_GROUP

LTEXT "Start:", 0, 21, 38, 26, 8, NOT
WS
GROUP

CONTROL _ "Formatted", DID_FILTER_START, 51, 38, 102, 8, "Formatted", WS_TABSTOP ; WS_VISIBLE

//ENTRYFIELD "", DID_FILTER START, 51, 38, 102, 8, NOT

// ES AUTOSCROLL i ES
MARGIN

LTEXT _ "End:", 0, 169, 38, 20, 8, NOT
WS_GROUP

CONTROL "Formatted", DID_FILTER_END) 194, 38, 102, 8, "Formatted", WS_TABSTOP ~ WS_VISIBLE

//ENTRYFIELD "", DID_FILTER END, 194, 38, 102, 8, NOT

// ES_AUTOSCROLL ; ES_MARGIN

DEFPUSHBUTTON"Commit") DID_OK, 5, 3, 150, PUSHBUTTON "Cancel", IDI-MGLASS1, 163, 3, 150, 13 END

END
DLGTEMPLATE LOADONCALL MOVEABLE DISCARDABLE
IDD_JOBLIST

BEGIN

DIALOG "Edit a Batch List", IDD JOBLIST) 5, 4, 408, 198, FS NOBYTEALIGN
;

WS VISIBLE, FCF SYSMENU i FCF TITLEBAR

BEGI N

CONTROL "ADSLBHeading", DID_JOBLIST_HEAD1NG, 5, 174, 395, 15, "ADSLBHeading", WS_VISIBLE

LISTBOX DIO_JOBLIST_ADSLIST, 5, 60, 395, 113, LS OWNERDRAW ;

LS_HORZSCROLL

LTEXT "Batch -Name", 0, 5, 43, 49, 8, DT_MNEMONIC

ENTRYFIELD "", DID_JOBLIST_JOBNAME, 10, 32, 140, 8, ES_MARGIN

LTEXT "Batch De-scription", 0, 170, 43, 79, 8, DT_MNEMONIC

ENTRYFIELD "", DID_J08LIST_JOBDESC, 175, 32) 223, 8, ES_MARGIN

PUSHBUTTON "Cl-ear", DID_JOBLIST_CLEAR, 5, 5, 45, 13) WS
GROUP

PUSHBUTTON _ "-Add", DID-JOBLIST_INSERT, 55, 5, 45, 13, NOT

WS_TABSTOP

PUSHBUTTON "Cl-one", DID-JOBLIST CLONE, 105, 5, 45, 13, NOT

Yed ..~. y/ ~ .L

WS_TABSTOP
PUSHBUTTON "-Delete", DID-JOBLIST DELETE, 155, S, 45, 13, NOT
WS_TABSTOP
PUSHBUTTON "-Modify Batch...", DID JOBLIST MODIFY, 205) 5, 76, 13, NOT WS_TABSTOP
PUSHBUTTON "-Cancel", DID OK, 340, 5, 60, 13 END
END
DLGTEMPLATE IDD_PICKSERV LOADONCALL MOVEABLE DISCARDABLE
BEGIN
DIALOG "Start Scheduler", 1DD PICKSERV, 39, 30, 260, 122, FS NOBYTEALIGN ; WS VISIBLE, FCF SYSMENU ; FCF T1TLEBAR
BEGIN
ICON IDI_SERVER, 0, 5, 101, 22, 16 CONTROL "ADSLBHeading", DID_PICKSERV_HEADING, 35, 89, 187, 15, "ADSLBHeading", WS_VISIBLE
LISTBOX DID_P1CKSERV_ADSLIST, 35, 24, 190, 66, LS OWNERDRAW ;
LS_HORZSCROLL
DEFPUSHBUTTON "Commi-t", DID_OK, 35, 5, 90, 13, WS_GROUP
PUSHBUTTON "-Cancel", IDI-MGLASS1, 135, 5, 90, 13, NOT
WS_TABSTOP
END
END
DLGTEMPLATE LOADONCALL MOVEABLE DISCARDABLE
IDD_EXECUTE

BEGIN

DIALOG "Executables", IDD_EXECUTE, 7, 37, 375, 137, FS NOBYTEALIGN
; WS VISIBLE) FCF SYSMENU
; FCF TITLEBAR

BEGI N

GROUPBOX "", 0, 5, 19, 366, 113 CONTROL "ADSLBHeading", D1D_EXECUTE_HEADING, 10, 108, 194, 15, "ADSLBHeading", WS_VISIBLE

LISTBOX DID_EXECUTE_ADSLIST, 10, 42, 196, 70, LS OWNERDRAW ;

LS_HORZSCROII

LTEXT "Program -Name") 0, 215, 91, 86, 8, DT_MNEMONIC

ENTRYFIELD "", DID_EXECUTE_PROGNAME, 227, 80, 128, 8, ES
MARGIN

LTEXT _ "Program -Filename", 0, 215) 61, 90, 8, DT_MNEMONIC

ENTRYFIELD "", DID_EXECUTE_PROGFILE) 227, 50, 127, 8, ES MARGIN

PUSHBUTTON "Cl-ear", DID EXECUTE CLEAR, 10, 25, 45, 13, WS_GROUP

PUSHBUTTON "-Add", DID EXECUTE INSERT, 60, 25, 45, 13, PUSHBUTTON "-Delete", DID_EXECUTE
DELETE, 110, 25, 45, 13, //PUSHBUTTON _ "-Update", DID EXECUTE UPDATE, 110, 25, 45, 13, NOT

// WS_TABSTOP

//PUSHBUTTON "-Delete", DID EXECUTE DELETE, 160, 25, 45, 13) NOT

// WS_TABSTOP

PUSHBUTTON "-Cancel", DID OK, 142, 3, 104, END

END
DLGTEMPLATE IDD_MACH1NES LOADONCALL MOVEABLE DISCARDABLE
BEGIN
DIALOG "Workstations", IDD MACHINES, 35, 50, 249, 129, FS NOBYTEALIGN ; WS VISIBLE, FCF SYSMENU ~ FCF TITLEBAR
BEGIN
LISTBOX IDD_MACHINES_LIST, 4, 22, 239, 88, LS_MULT1PLESEL ;
LS_OWNERDRAW i LS_HORZSCROLL i WS_GROUP
PUSHBUTTON "-Modify", IDD_MACHINES MODIFY, b, 4, 40, 14, WS_GROUP ; WS_DISABLED
PUSHBUTTON "'Delete", IDD MACHINES DELETE, 49, 4, 40, 14, WS_DISABLEO
PUSHBUTTON "-Cancel", IDD_MACHINES_CANCEL, 92, 4, 40, 14 PUSHBUTTON "-Help", IDD_MACHINES_HELP) 203, 4, 40, 14, BS HELP
CONTROL "" IDD MACHINES LISTHEADER, 4, 111, 239, 15, "ADSLBHeading", WS VISIBLE

,.:E..C'v i ..'~~-1 END
END
DLGTEMPLATE
IDD_WS_DETAILS
LOADONCALL
MOVEABLE
DISCARDABLE

BEGIN

DIALOG "workstationDetails", IDD_wS_DETAILS, 57, 36, 252, 130, NS VISIBLE, FCF SYSMENU ; FCF-TITLEBAR

BEGIN

LTEXT "Workstation Name:", 201, 11, 116, 79, 8, NOT

NS_GROUP

ENTRYFIELD "", DIO_WSDETAIL_MACHINENAME, 98, 116, 139, 8, ES_MARGIN i WS_GROUP

LTEXT "Description:", 203, 39, 104, 51, 8, NOT WS_GROUP

ENTRYFIELD "", DID_WSDETAIL DESCRIPTION, 98, 104, 139, 8, ES
MARGIN

//Requires OS2 _ 2.0 //LTEXT "Max Batches:", 205, 48, 92, 42, 8, NOT WS GROUP

//CONTROL "", DID_WSDETAIL_MAXJOBS, 96, 90, 45, 12, // WC_SPINBUTTON, SPBS_ALLCHARACTERS
; SPBS_NUMERICONLY ;

// SPBS_MASTER ; SPBS_SERVANT ; SPBS_JUSTDEFAULT
;

// SPBS_FASTSPIN ~ WS_GROUP i WS_TABSTOP
; WS_VISIBLE

LTEXT "Max Batches:", 205, 34, 92, 56, 8, NOT WS_GROUP

ENTRYFIELD "", DID_WSDETAIL_MAXJOBS, 98, 92, 30, 8, NOT

E5 AUTOSCROLL ; ES_MARGIN

LTEXT "Select Groups", 207, 7, 80, 58, LISTBOX D1D_uSDETAIL_GROUPLIST, 8, 22, 235, 40, LS_MULTIPLESEL ~ LS_OWNERDRAW ~
LS
HORZSCROLL

DEFPUSHBUTTON_ "Commi-t", DID_WSDETAIL COMMIT, 6, 4) 42, 14, WS_GROUP ~ WS_DISABLED

PUSHBUTTON "-CanceL") DID_WSOETAIL_CANCEL, 51, 4, 40, 14 PUSHBUTTON "-Help", DID_uSDETAIL_HELP, 206) 4, 40, 14, BS_HELP

CONTROL "", DID_WSDETAIL_GROUPLISTHEADER, 8, 63, 235, 15, "ADSLBHeading", WS VISIBLE

EN D

END

BEGIN
DIALOG "Groups", IDD_GROUPS, 35, 50, 249, 129, FS NOBYTEALIGN i WS VISIBLE, FCF SYSMENU ; FCF TITLEBAR
BEGIN
LISTBOX IDD_GROUPS_LIST, 4) 21, 239, 88, LS_MULTIPLESEL ;
LS_OI,1NERDRAW i LS_HORZSCROLL i WS_GROUP
PUSHBUTTON "-Modify", IDD GROUPS MODIFY, 6, 4, 40, 14, WS GROUP
WS_DISABLED
PUSHBUTTON "-Delete", IDD GROUPS DELETE, 49, 4, 40, 14, WS_DISABLED
PUSHBUTTON "-Cancel", IDD_GROUPS_CANCEL, 92, 4, 40, 14 PUSHBUTTON "'Help") IDD_GROUPS_HELP, 203, 4, 40, 14, BS HELP
CONTROL "", IDD_GROUPS_LISTHEADER, 4, 111, 239, 15, "ADSLBHeading", WS VISIBLE
END
END
DLGTEMPLATE _DETA1LS LOADONCALL MOVEABLE
IDD_GRP DISCARDABLE

BEGIN

DIALOG "GroupDetails", IDD_GRP_DETAILS, WSVISIBLE, 58, 48, 252, 119, FCF-SYS MENU ; FCF-TITLEBAR

BEGIN

LTEXT "Group Name:", 201, 15, WS_GROUP
106, 53, 8, NOT

ENTRYFIELD "", DID_GRPDETAIL_GROUPNAME,64,8, 76, 106, 1 ES_MARGIN ; WS_GROUP

LTEXT "Description:", 203, 17, WS_GROUP
94, 51, 8, NOT

ENTRYFIELD "", DID_GRPDETAIL DESCRIPTION,164,8) 76, 94, ES_MARGIN

LTEXT "Select Workstations", 207,8 7, 80, 84, ~'i LISTBOX DID_GRPDETAIL_MACHINELIST, 8, 22, 235, 41, LS_MULTIPLESEL ; LS ONNERDRAW ~ LS_HORZSCROLL i WS_GROUP
DEFPUSHBUTTON "Commi-t", DID_GRPDETAIL COMMIT, 6, 4, 42, 14, WS_GROUP ; WS_DISABLED
PUSHBUTTON "-Cancel", DID_GRPDETAIL_CANCEL, 51, 4, 40, 14 PUSHBUTTON "-Nelp", DID_GRPDETAIL_HELP, 206, 4, 40, 14, BS_HELP
CONTROL "", DID_GRPDETAIL_MACNINELISTHEADER, 8, 64, 235, 15, "ADSLBHeading", WS VISIBLE
END
END
/*********************************x*x************************************
* Copyright (c) 1990, 1991, 1992, 1993 American Airlines * File: BATCH.H
* System: Batch Administration * Description:
************************************************************************/
/* #define MSDEMO */
#define BUTTONHORZSEP 2 #define BUTTONVERTSEP 2 #define HEADTOPMARGIN 15 #define LISTEDGEMARG1N 10 #define TID_CLIENT_REFRESH 13 #define CLIENTREFRESH 15000 #define TID_SCHEDULER_UP 14 #define TID_SCHEDULER_DO~1N 15 #define FASTSCHEDREFRESN 2000 #define TID_ZOOM_REFRESH 16 #define ZOOMREFRESH 5000 #define CLIENT_COLUMNS 7 #define GRPDLG_1_COLUMNS 2 #define GRPOLG_2_COLUMNS 2 #define GRPDLG_3_COLUMNS 2 #define MCHDLG_COLUMNS 3 #define EXEDLG_COLUMNS 2 #define JBLST_COLUMNS 4 #define JBSTP_COLUMNS 4 #define RESUME_COLUMNS 3 #define PICKSERV COLUMNS 2 SHORT sCurrentView;
#define BITMAPCOUNT 15 typedef struct ADSUSERBTN C
USHORT us8uttonld;
HPO1NTER hpointer;
ADSUSERBTN;
#define PIID_MODIFY 1 #define PND SCHED 2 #def i ne PS~1D_DATA_JOB I D 1 #define PND DATA JOBNAME 2 typedef struct PNDSTRUCT C
USHORT usPwdType;

~. ~a ;"9 ~~~'_ ? 6 J

PSZ pszJobData;
USHORT usDataType;
J PHDSTRUCT;
#ifdef MSDEMO
EXTERN USERATTR UserAttr;
#endif EXTERN USERATTR * pUserAttr;
EXTERN DBPROCESS *dbADS;
EXTERN DBPROCESS *dbproc;
EXTERN DBPROCESS *dbtemp;
EXTERN LOGINREC *login;
EXTERNHAB hab;

EXTERNHAND hwndFrame;

EXTERNCHAR pszFilterJobIJOBNAMELENGTH7;

EXTERNCHAR pszFilterByIJOBEDITBYLENGTH7;

EXTERNCHAR pszFilterGroupIGROUPNAMELENGTH7;

EXTERNCHAR pszFiIterStartIJOBDATELENGTH7;

EXTERNCHAR pszFilterEndIJOBDATELENGTH7;

EXTERNHPOINTERhpointerArrayLBITMAPCOUNT
+ 17;

EXTERNHWND hWndHelpInstance;

EXTERNCHAR szServerNamet157;

EXTERNHELPINIThmiHelpData;

EXTERNLONG GBLStatusColor;

EXTERNBOOL GBLbAdnin;

/************************/
/* ICON AND BITMAP IDS */
/************************/
/*
* NOTE: Not all of the icon ids live here. Due to limitations of the * resource compiler, the defines for icons with ids 2, 3, 4, & 17 * are assigned in the dialog box header files in which these icons * appear.
*/
#define IDI_BITBASE 2 #define IDI_STOPLIGHT 5 #define 1DI RESCHED 6 #define IDI_RUSH 7 #define IDI ERASER 8 #define IDI_STEPS 9 #define IDI_WARN1 10 #define IDI_NOSERVER 11 #define IDI_NOJOBS 12 #define IDI_GRPBUSY 13 #define ID1_RUN 14 #define IDI_FINISH 15 #define IDI VERIFY 16 #define IDB STATUS 18 #define CLIENTUSERBTNCOUNT 7 -34- >..3..~
MRESULT EXPENTRY ClientWndProc(HWND, USHORT, MPARAM, MPARAM);
MRESULT EXPENTRY DayTimerDlgProc(HWND, USHORT, MPARAM, MPARAM);
MRESULT EXPENTRY EnterPasswordDlgProc(HWND, USHORT, MPARAM, MPARAM);
MRESULT EXPENTRY ExecuteDlgProc(HWND, USHORT, MPARAM, MPARAM);
MRESULT EXPENTRY FilterDlgProc(HWND, USHORT, MPARAM, MPARAM);
MRESULT EXPENTRY GroupsDlgProc(HWND, USHORT, MPARAM, MPARAM);
MRESULT EXPENTRY JobListDlgProc(HWND, USHORT, MPARAM, MPARAM);
MRESULT EXPENTRY JobStepDlgProc(HWND, USHORT, MPARAM, MPARAM);
MRESULT EXPENTRY MachinesDlgProc(HWND, USHORT, MPARAM, MPARAM);
MRESULT EXPENTRY NewTitleBarProc(HWND, USHORT, MPARAM, MPARAM);
MRESULT EXPENTRY PickServerDlgProc(HWND, USHORT, MPARAM, MPARAM);
MRESULT EXPENTRY ResumeDlgProc(HWND, USHORT, MPARAM, MPARAM);
MRESULT EXPENTRY SetPasswordDlgProc(HWND, USHORT, MPARAM, MPARAM);
MRESULT EXPENTRY ZoomDlgProc(HWND, USHORT, MPARAM, MPARAM);
SHORT GetSelectedltemString(HWND) USHORT, PSZ) USHORT, BOOL);
VOID LoadListBox(HWND, USHORT, PSZ, PSZ, USHORT);
VOID RushJob(HWND, PSZ);
VOID SetPasswordFlags(HWND, DBCHAR *, DBPROCESS *);
VOID SetPushButtons(HWND, USHORT, USHORT, USHORT *);
VOID SetStatusColor(VOID);
VOID SetUserRequest(HWND, PSZ, CHAR);
VOID ToggleButtonRange(HWND, USHORT, USHORT, BOOL, BOOL);
VOID ToggleEntryField(HWND, USHORT, USHORT, BOOL);
VOID safe dbfcmd(DBPROCESS *dbproc, char *fstring, ...);
#+***********************************************************************
# Copyright (c) 1990, 1991, 1992, 1993 American Airlines # File: BATCH.PMK
#
# System: Batch Administration # Description: Batch Administration Polymake file.
#
~.**********************************************************************
CFLAGS;= -MT

OBJS= batch0l.obj batch02.obj batch03.obj LIBS= ads adsnet llibce HEADERS= batchdef.h batchdlg.h batch.h bamenu.h \

bamenurc.h DLGHEADERS=dialog.h batchstr.h bamenurc.h DIALOGS= batch.dlg ICONS= lanrun.ico mglassl.ico schedl.ico golght.ico stoplght.ico \

resched.ico bumpup.ico eraserdn.ico steps.ico warningl.ico \

noserver.ico nojobs.ico grpbusy.ico running.ico finish.ico \

verify.ico server.ico servflag.bmp #ALL: batch.exe batch.hlp ALL: batch.exe batch.res:ft(DIALOGS) S(DLGHEADERS) E(ICONS)7 batch0l.obj:fS(HEADERS) S(DLGHEADERS)) batch02.obj:fE(HEADERS) E(DLGHEADERS)7 batch03.obj:fE(HEADERS) E(DLGHEADERS)7 batch.exe:S(OBJS) Lbatch.def7 batch.res %do linkexe #batch.hlp: lbatch.ipfl ystatic char szRevision() _ "$Revision: 4.4 $ BATCH01.C";
~************************************************************************

* Copyright1990, 1991, 1992, 1993 American Airlines (c) * File: BATCH01.C

* System:Batch Administration * Description:The Batch Administration program provides a user * interface to Batch Scheduler, allowing users to build, * submit, and query batches.

* Users identified as batch administrators will be able * to register the executable programs that users can * include in batches, register workstations that jobs can * run on, and can also be used to remotely start, pause, * and stop the Batch Scheduler on a LAN workstation.

* The automated rescheduling of batch jobs is handled by * a stored procedure. The Batch Scheduler is responsible * for identifing runnable jobs, for locating a target * machine) for shipping the execution requests to the * workstations, and for updating the job run record.

* This module contains the main function, the window * message loop, the Client4lndProc, and many of the dialog * boxes used for inputing and displaying data.

************************************************************************~

#define DBMSOS2 #define INCL_PM
#define INCL_VIO
#define INCL GPILCIDS
#include <os2.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>
#include <sqlfront.h>
#include <sqldb.h>
#define EXTERN
#include "adslen.h"
#include "ads. h"
#include "adsnet.h"
#include "dialog. h"
#include "batchdef.h"
#include "batchdlg.h"
#include "batch. h"
#include "errors. h"
HAB hab;
PSZ WC_CLIENT = "LanRunner";
HWND hwndList;
H11ND hwndHead;
HNND hwndClient;
USHORT usTimer;

-HBtTMAP hbmStatus;

PFNWP OldTitleBarProc;

/*__________________________________________________________________________*/

/* Function Prototypes */

/*__________________________________________________________________________*/

MRESULT EXPENTRY ClientWndProc(H41ND, USHORT, MPARAM, MPARAM);

MRESULT EXPENTRY wpSCFrame(HWND, USHORT, MPARAM, MPARAM);

MRESULT EXPENTRY ExecuteDlgProc(HHND, USHORT, MPARAM, MPARAM);

MRESULT EXPENTRY dpMachine(HWND, USHORT, MPARAM,*/
MPARAM); /* jdb MRESULT EXPENTRY dpWSDetail(HWND, USHORT, */
MPARAM, MPARAM); /* jdb MRESULT EXPENTRY dpGroup(H41ND, USHORT, MPARAM,*/
MPARAM); /* jdb MRESULT EXPENTRY dpGroupDetail(HNND, USHORT, */
MPARAM, MPARAM); /* jdb MRESULT EXPENTRY ZoomDlgProc(HWND, USHORT, MPARAM, MPARAM);

MRESULT EXPENTRY FilterDlgProc(HwND, USHORT, MPARAM, MPARAM);

MRESULT EXPENTRY PickServerDlgProc(HWND, USHORT, MPARAM, MPARAM);

MRESULT EXPENTRY NewTitleBarProc(HUND, USHORT, MPARAM, MPARAM);

VOID SetStatusColor(VOID);

VOID SetActive0ptions(HWND);

/*****************************************************************************/

/* */

/* MAIN */

/x */

/*********************************************************************x*******/

SNORT main( ) HMQ hmq;

aMSG qmsg;

CHAR szText1C807;

CHAR szText2C807;

static ULONG flFrameFlags = FCF_TITLEBAR ;
FCF
SYSMENU ;

_ FCF_SIZEBORDER i FCF_ICON ~ FCF_MINMAX

FCF_SHELLPOSITION ; FCF_NOBYTEALIGN i FCF_MENU ; FCF ACCELTABLE i FCF TASKLIST;

hab = Wintnitialize(0);

hmq = WinCreateMsgaueue(hab, 0);

ADSRegisterClass(hab);

HinRegisterClass(hab, WC CLIENT, (PFNWP)ClientWndProc,;
CS SIZEREDRAW, 0) /*

* Set the default view - this is a global.

*/

sCurrentView = IDM VIE41DEFAULT;

hwndFrame = HinCreateStdlJindow (HWND DESKTOP, OL, BflFrameFlags, WC CLIENT, (PSZ) NULL, OL, (HMODULE)NULL, IDM BA, &hwndClient);
pUserAttr = ADSLogin(&dbproc, WinWindowFromID(hwndFrame, FID MENU), "BA");
HinSetWindowPos(hwndFrame, HuND_TOP, 0,0,0,0, SWP_ZORDER);
WinPostMsg(hwndClient, bM_TIMER, MPFROMSHORT(T1D CLIENT REFRESH), OL);
HinSendhlsg(hwndFrame, 1M USER, MPFROMP(HinSubclassWindow(hwndFrame, (PFNHP)wpSCFrame)), 0);
/*
* Prepare HELPINIT data structure...
*/
hmiHelpData.cb - sizeof(HELPINIT);
hmiHelpData.ulReturnCode - 0;
hmiHelpData.pszTutorialName - NULL;
hmiHelpData.phtHelpTable - (PVOID)(OxFFFF0000 ~ ID_HELPTABLE);
hmiHelpData.hmodHelpTableModule - OL;

hmiHelpData.hmodAccelActionearModule = OL;
hmiHelpData.idACCelTable - 0;
hmiHelpData.idActionBar - 0;
WinLoadString(hab, (HMODULE)NULL, IDS USERTITLE, sizeof(szTextl), (PSZ)szText1);
hmiHelpData.pszHelpWindowTitle - szTextl;
hmiHelpData.usShowPanelld - CMIC_HIDE_PANEL-ID;
hmiHelpData.pszHelpLibraryName - "batch.hlp";
/*
* Create HELP instance and associate it with the application frame.
*/
if (!(hwndHelpInstance = WinCreateHelpInstance(hab, BhmiHelpData))) NinLoadString(hab) (HMODULE)NULL, IDS_NO_HELP, sizeof(szTextl), (PSZ)szTextl);
NinLoadString(hab, (HMODULE)NULL, IDS WARNING, sizeof(szText2), (PSZ)szText2);
NinMessageBox(HWND_DESKTOP, HuND_DESKTOP, szText1, szText2, (USHORT) HULL, MB OK i MB-1CONEXCLAMATION i MB MOVEABLE);
/* i f *~
else winAssociateHelplnstance(hwndHelpInstance, hwndFrame);
IIinLoadString(hab, (HMODULE)NULL, IDS_CANT LOGON, sizeof(szTextl), (PSZ)szTextt);
if (dbproc==NULL) C
WiMlessage8ox(HWND DESKTOP) HWND_DESKTOP, szTextl, NULL, (USHORT) NULL, MB OK ~ MB-ICONEXCLAMATION ; MB MOVEABLE);
if (hwndHelpInstance) WinDestroyHelpInstance(hwndHelpInstance);
WinDestroylJindow(hwndFrame);
4linDestroyMsgOueue (hmq) ;
WinTerminate(hab) ;
ADSExitProgram(0);
return(0);
/* t f */
/*
* If the user is an administrator (ie the IDM ADMIN menu exists), * set the titlebar to the admin title, else use the normal title.
*/
if((WinSend~lsg(IIinllindowFromID(hwndFrame, FID MEHU), MM-ISITEMVALID, MPFROM2SHORT(IDM HORKSTATIONS, TRUE), NULL)) ~i (WinSend4sg(WinNindowFromlD(hwndFrame, FID MENU), MM-ISITEMVALID, MPFROM2SHORT(IDM_GROUPS, TRUE), NULL)) ii (WinSend~lsg(IIiMlindowFromID(hwndFrame, FID_MENU), MM-ISITEMVALID, MPFROM2SHORT(IDM EXECUTE, TRUE), NULL))) f GBLbAdmin = TRUE;
4linLoadString(hab, (HMOOULE)NULL, IDS ADMINTITLE, sizeof(szTextt), (PSZ)szTextl);
/* if */
else GBLbAdmin = FALSE;
WinLoadString(hab, (HMODULE)NULL, IDS_USERTITLE, sizeof(szTextl), (PSZ)szTextl);
1 /* else */
IIinSetWindowText(hwndFrame, szTextl);
/*
* Subclass the titlebar so we can paint our status bitmaps s~
~~ _i. a */
OldTitleBarProc = 4linSubclassWindow(NinNindowFromID(hwndFrarm', FID
TITLEBAR), (PFNWP)NewTitleBarProc);
WinShowWindow(hwndFrame, TRUE);
/* THE loop */
while (UinGetMsg (hab, &oansg, NULL, 0, 0)) WinDispatchMsg (hab, &qmsg) ;
if (hwndHelpInstance) WinDestroyHelptnstance(hwndHelpInstance);
winDestroyWindow(hwndFrame);
WinDestroyMsgOueue(hmq);
WinTerminate(hab);
ADSExitProgram(0);
dbclose(dbproc);
return(0);
/* main */
/*****************************************************************************/

/* */
/* Client4lndProc */
/* */
/* Handles the creation of the buttons, the painting of the client window, */
/* all button and menu selections and refresh timer messages. */
/* */
/* Note: The refresh timer is stopped upon entry to each dialog box to */
/* improve responsivness. */
/* */
/*****************************************************************************/

MRESULT EXPENTRY ClientWndProc(HWND hwnd, USHORT msg) MPARAM mpt, MPARAM mp2)( HPS hps;
HHND hwndButton;
HuND hwrxi~lenu;
RECTL rectl;
PSUP pswp = mpl;
USHORT bitmap;
USHORT button;
USHORT x8utton;
USHORT y8utton;
USHORT cxButton;
USHORT cyButton;
USHORT i;
USHORT usBytes;
POINTL ptl;
DBCHAR JobRunID[JOBIDLENGTH];
ULONG ulNetConnect;
USHORT usRequest;
FONTMETRICS fm;
CHAR szTextl[80];
CHAR szText2I80];
staticBOOL bInitial = TRUE;

staticSHORT color = 0;

staticSHORT sTextHeight;

staticADSUSERBTNButtoMrray[CLIENTUSERBTNCOUNT];

staticUSHORT usPushButtons[CLIENTUSERBTNCOUNT];

staticCHAR szHeadingTop[80];

staticCHAR szHeadingBottom[80];

staticLONG alColWidthCCLIENT COLUMNS];

staticLONG lcxUScrollBar;

staticUSHORT usStatusTick = 0;

i/
r:J ~l. ~-switch (msg) case NM_CONTROL: /*____________________________________________________*/
switch (SHORT2FROMMP(mp1)) a case LN_SELECT:
if (SHORTIFROhIMP(mp1) _= ID CLIENT ADSLIST) SetActive0ptions(hwnd);
return (0);
/*
* If the user has double clicked on an item call the zoom dlg.
*/
case LN_ENTER: /*________________________________________________*/
if (SHORT1FROMMP(mpt) _= ID_CLIENT_ADSLIST) if (GetSelectedItemString( hwnd, ID_CLIENT ADSLIST) JobRunID, JOBIDLENGTH, TRUE) < 0) return(0);
WinDlgBox(HWND DESKTOP, hwnd, (PFNWP)ZoomDlgProc, (HMODULE)NULL) IDD ZOOM, (PVOID) atol(JobRunID));
/* if *%
return(0);
/* switch */
break;
case IM CREATE: /*_____________________________________________________*/
/* Clear the view filters (Global). */
strcpy(pszFilterJob, "");
strcpy(pszFilterBy, "");
strcpy(pszFilterGroup, "");
strcpy(pszFilterStart, "");
strcpy(pszFilterEnd, "");
/*
* Load the colum title strings from the resource.
*/
WinLoadString(hab, (HMODULE)NULL, IDS_CLIENT_L1ST1_TOP, sizeof(szHeadingTop), (PSZ)szHeadingTop);
WinLoadString(hab, (HMODULE)NULL, IDS_CLIENT_LIST1_BOT) sizeof(szHeadingBottom), (PSZ)szHeadingBottom);
/* Set the column widths to zero. */
for (i = 0; i < CLIENT COLUMNS; i++) alColWidth(i7 == 0;
/* Find the button sizes */
xButton = BUTTONHORZSEP;
y8utton = BUTTONVERTSEP;
cxButton = (USHORT) WinOuerySysValue(HHND DESKTOP, SV CXICON) + 16;
cyButton = (USHORT) WinGuerySysValue(HWND DESKTOP, SV CYICON) + 16;
/* Create the Listbox and its heading */
hwndHead = WinCreateWindow (hwnd, "ADSLBHeading", "", OL, 0,0,0,0, hwnd, HWND_BOTTOM, ID CLIENT_HEADING, NULL, NULL);
hwndList = 4inCreate4indow (hwnd, WC_LISTBOX, ""
LS_HORZSCROLL ; LS 041NERORAI1 ; WS TABSTOP, 0,0,0,0, hwnd, HWND_BOTTOM, ID CLIENT ADSLIST, NULL, NULL);
/*

~i ~~
f~ i * Figure out how much vertical space we need for current font on * the current device.
*/
hps = WinGetPS(hwnd);
Gpi~ueryFontMetrics(hps, (LONG) sizeof(fm), &fm);
/*
* Save the font height. The lowercase descender height was left off * because the heading text was too spread out with it.
*/
sTextHeight =(SHORT)(fm.lMaxBaselineExt);
hbmStatus = GpiLoadBitmap(hps, 0, IDB STATUS, OL, OL);
WinReleasePS(hps);
/* Load ALL of the applications bitmaps */
for (bitmap = 0; bitmap < BITMAPCOUNT; bitmapt+>
hpointerArraylbitmap7 = WinLoadPointer( HWND_DESKTOP, (HMODULE)NULL, bitmap + IDI BITBASE);
/*
* Create all of the buttons. The first set of bitmaps are also * button tops.
*/
for (button = 0; button < CLIENTUSERBTNCOUNT; button++) C
ButtonArray(buttonl.usButtonId = USRBTN_BASE + button;
ButtonArraylbutton7.hpointer = hpointerArrayLbuttonl;
hwndButton = WinCreateWindow (hwnd, WC BUTTON, BS_PUSHBUTTON, 0,0,0,0, hwnd, HWND_BOTTOM, ButtoMrraylbutton7.usButtonId, NULL, NULL);
/* Horzontial whitespace between buttons */
x8utton += cxButton + BUTTONHORZSEP;
usPushButtons(button) = ButtonArray(button7.usButtonld;
AOSSubclassPushButton(hwndButton, hpointerArraylbutton7, hpointerArray(button7, SYSCLR BUTTONMIDDLE);
/* for *%
/* Set Default Button */
SetPushButtons(hwnd, CLIENTUSERBTNCOUNT, ID_CLIENT MGLASS, usPushButtons);
/* Initially disable some menu choices and icons */
SetActive0ptions(hwnd);
/* Get the width of the vertical scroll bar for heading sizing */
lcxVScrollBar = WinOuerySysValue(HWND DESKTOP, SV CXVSCROLL);
/*
* Post a Timer message so that we get a fast refresh */
break;
case WM TIMER: /*________________________________-__-_-________________*/
switch (SNORT1FROMMP(mp1)) case TID SCHEDULER UP: /*--------------------------------------*/
DosBeep(600, 100);
WinStopTimer(hab, hwndClient, usTimer);
SetStatusColor();
if (GBLStatusColor == Ox00FF0000L) usTimer = WinStartTimer(hab, hwndClient, TID SCHEDULER UP, FASTSCHEDREFRESH);

r~~ ~_ ~~' else usTimer = WinStartTimer(hab, hwndClient, TID CLIENT REFRESH, CLIENTREFRESH);
return(0);
case TID_SCHEDULER_DOWN: /*------------------------------------*/
WinStopTimer(hab, hwndClient, usTimer);
SetStatusColor();
if (GBLStatusColor == Ox00FF0000L) usTimer = WinStartTimer(hab, hwndClient, TID CLIENT REFRESH, CLIENTREFRESH);
else usTimer = WinStartTimer(hab, hwndClient, TID SCHEDULER DOWN, FASTSCHEDREFRESH);
return(0);
/*
* Tick, Tick, Tick. Clear the colurm widths to force a recalc_ * Reload the listbox.
*/
case TID CLIENT REFRESH: /*------------------------------------*/
for (i = 0; i < CLIENT COLUMNS; i++) alColWidth(iJ = 0;
if (GetSelectedItemString( hwrxJ) ID_CLIENT_ADSLIST, JobRunID, JOBIDLENGTH, FALSE) >= 0) LoadListBox(hwnd, ID_CLIENT_ADSLIST, (PSZ)NULL, (PSZ)JobRunID, sCurrentView);
else LoadListBox(hwnd, 1D CLIENT ADSLIST, (PSZ)NULL, (PSZ)NULL, sCurrentView);
if (!(usStatusTick++X4)) SetStatusColor();
dbcmd(dbproc, "SELECT convert(char(10), GetDate(), 8)");
dbsqlexec(dbproc);
dbresults(dbproc);
C
char bufferfll);
dbbind(dbproc, 1, NTBSTRINGBIND, 11, buffer);
while(dbnextrow(dbproc)!=NO_MORE_ROWS);
WinSendAsg( WirrilindowFromID(Wir~ueryWindowChwnd, OW_PARENT, FALSE), FID_MENU), MM_SETITEMTEXT, MPFROMSHORT(IDM BA DBTIME), MPFROMPCbuffer) );
return(0);
/* switch */
break;
case WM INITMENU: /*___________________________________________________*/
WinStopTimer(hab, hwndClient, usTimer);
return(0);
case WM_MENUEND: /*____________________________________________________*/
usTimer = WinStartTimer(hab, hwndClient, TID CLIENT REFRESH, CLIENTREFRESH);
returnCO);
case WM_ACTIVATE: /*___________________________________________________*/
if (SHORT1FROMMP(mp1)) usTimer = WinStartTimer(hab, hwndClient, T1D CLIENT REFRESH, CLIENTREFRESH);
/*
* Post a Timer message so that we get a fast refresh */

r~

if (!(blnitial)) NinPostMsg(hwndClient, NM_TIMER, MPFROMSHORT(TID CLIENT REFRESH), OL);
else blnitial = FALSE;
/* if */
else 4linStopTimer(hab) hwndClient, usTimer);
return(0);
case I~M~_CLOSE: /*______________________________________________________*/
/* Bye, Bye. Throw out those pointers on your way out. */
WinStopTimer(hab, hwndClient, usTimer);
WinDestroyHindow(hwndList);
uinDestroyHindow(hwndHead);
for (button = 0; button < CLIENTUSERBTNCOUNT; button++) uinDestroyHindow(WinWindowFromID(hwnd, ButtonArray(button7.usButtonId));
for (bitmap = 0; bitmap < BITMAPCOUNT; bitmap++) WinDestroyPointer(hpointerArray(bitmap7);
break;
case 41M SIZE: /*_______________________________________________________*/
/*
* Allow the list, heading and buttons to be sized and * positioned based on the size of the frame.
*/
xButton = BUTTONHORZSEP;
yButton = BUTTONVERTSEP;
cxButton = (USHORT) WinOuerySysValue(HWND DESKTOP, SV CXICON) + 16;
cyButton = (USHORT) NinOuerySysValue(HwND DESKTOP, SV CYICON) + 16;
WinSetHindowPos(hwndHead, (HWND) NULL, LISTEDGEMARGIN, SHORT2FROMMP( mp2 ) - sTextHeight * 2 - HEADTOPMARGIN, SHORT1FROMMP( mp2 ) - 2 * LISTEDGEMARGIN
- (SHORT) lcxVScrollBar, sTextHeight * 2, SWP SIZE ; SWP MOVE i SHP SHOM);
WinSet4lindowPos(hwndList, (HWND) NULL, LISTEDGEMARGIN, cyButton + 2 * BUTTONVERTSEP + LISTEDGEMARGIN) SHORT1FROMMP( mp2 ) - 2 * LISTEDGEMARGIN, SHORT2FROMMP( mp2 ) - (cyButton + 2 * BUTTONVERTSEP) - sTextHeight*2 - HEADTOPMARGIN - LISTEDGEMARGIN - 1, SWP SIZE ~ SWP MOVE ; SWP SHOW);
for (button = 0; button < CLIENTUSERBTNCOUNT; button++) C
/* If this is the schedule button, right justify */
if (ButtoMrrayCbutton7.usButtontd == ID_CLIENT SCHED) WinSet4lindowPos(WirrilindowFromID(hwnd, ButtonArray(button7.useuttonld), (HHND) NULL, SHORT1FROMMP( mp2 ) - BUTTONHORZSEP - cx8utton, yButton, cxButton, cyButton, SWP SIZE ; SHP MOVE ~ SHP SHOW);
/* 1 f else C
/* else left justify the rest */
WinSetHindowPos(IIinWindowFromID(hwnd, ButtoMrray(button7.usButtonId), (HWND) NULL, xButton, y8utton, cxButton, cy8utton, SHP SIZE ; SWP MOVE ; SWP SHOW);

.:
xButton += cxButton + BUTTONHOR2SEP;
/* else */
/* for */
break;
case NM COMMAND: /*___________________________________________________-*/
switch (COMMANDMSG(&nsg)->cmd) C
case IDM_BA_DBTIME: /*____________________________________-__*/
NinPostMsg(hwnd, NM_TIMER, MPFROMSHORT(TID CLIENT REFRESH), OL);
break;
/*
* ADMIN, executables menu.
*/
case IDM_EXECUTE: /*___________________________________-_____*/
WinDlgBox(HUND DESKTOP, hwnd, (PFNWP)ExecuteDlgProc, (HMODULE)NULL, IDD EXECUTE, (PVOID) atol(JobRunID));
return(0);
/*
* ADMIN, workstations menu.
*/
case IDM_tdORKSTATIONS: /*------------------------------------*/
WinDlgBox(HHND DESKTOP, hwnd, (PFNWP)dpMachine, (HMODULE)NULL, IDD MACHINES, NULL);
return(0);
/*
* ADMIN, groups menu.
*/
case IDM_GROUPS: /*______________________-_________-_________*/
NinDlgBox(HWNO DESKTOP, hwnd, (PFNWP)dpGroup, (HMODULE)NULL, IDD GROUPS, NULL);
return(0);
/*
* FILE, exit menu.
*/
case IDM_EX1T: /*____________________________________________*/
HinPostMsg(hwnd, HM_CLOSE, OL, OL);
WinStopTimer(hab, hwnd, usTimer);
usTimer = 0;
return(0);
/*
* SCHEDULER, Refuse new jobs menu.
*/
case IDM_REFUSEJOBS: /*--------------------------------------*/
if (ADSNetConnect(&ulNetConnect, szServerName, BATCHD SERVICE))C
break;
/* if */
usRequest = BATCHD_REFUSE NEwJOBS;
/* Tickle the scheduler so it will look for runnables. */
ADSNetNrite(ulNetConnect, &usRequest, sizeof(usRequest));
ADSNetDisconnect(ulNetConnect);
SetStatusColor();
return(0);
/*
* SCHEDULER) Accept new jobs menu.
*/
case IDM ACCEPTJOBS: /*______________________________________*/

~~ _ '~'~.~~

if (ADSNetConnect(BulNetConnect, szServerName, BATCHD_SERVICE))C
break;
J /* i f */
usRequest = BATCHD_ACCEPT_NEWJOBS;
ADSNetwrite(ulNetConnect, &usRequest, sizeof(usRequest));
ADSNetOisconnect(ulNetConnect);
SetStatusColor();
return(0);
/*
* SCHEDULER, Start */
case IDM STARTSCHED: /*--------------------------------------*/
/* _ * We wilt start no scheduler before its time. If the * scheduler is running (ie the current status icon color * is NOT RED) we will post an error message and ignore * the request. The StatusColor flag is used for speed -* net connects to a non-existent server are slow.
*/
if (GBLStatusColor == Ox00FF0000L) C
HinStopTimer(hab, hwndClient, usTimer);
if(WinDlgBox(HWND DESKTOP, hwnd, (PFNLIP)PickServerDlgProc, (HMODULE)NULL, IDD_PICKSERV, NULL)) usTimer = WinStartTimer(hab, hwndClient, TID SCHEDULER UP, FASTSCHEDREFRESH);
else usTimer = WinStartTimer(hab, hwndClient, TID CLIENT REFRESH, CLIENTREFRESH);
/* if *~
else C
WinLoadString(hab, (HMODULE)NULL, IDS CANT START, sizeof(szTextl), (PSZ)szTextt);
WinLoadString(hab, (HMODULE)NULL, IDS_ERROR, sizeof(szText2), (PSZ)szText2);
LIiMlessageBox(HWND DESKTOP, HWND_DESKTOP, szTextl, szText2, (USHORT) NULL, MB OK ; MB ERROR ~ MB MOVEABLE);
/* else uinUpdateWindow(hwnd>;
return(0);
/*
* SCHEDULER, Stop */
case IDM_STOPSCHED: /*_______________________________________*/
WinStopTimer(hab, hwndClient, usTimer);
if (ADSNetConnect(&ulNetConnect, szServerName, BATCHD SERVICE))C
break;
) /* i f */
usRequest = BATCHD_STOP;
ADSNetWrite(ulNetConnect, &usRequest, sizeof(usRequest));
ADSNetRead(ulNetConnect) BusRequest, sizeof(usRequest), &useytes);
if (usRequest) C
HinloadString(hab, (HMODULE)NULL, IDS CANT_STOP, sizeof(szTextl), (PSZ)szTextl);
WinLoadString(hab, (HMODULE)NULL, IDS_ERROR, sizeof(szText2), (PSZ)szText2);
WiNAessageBox(H41ND DESKTOP, H41ND DESKTOP, szTextl, 4 5 '~'~ ~ ~ s _ a '- a szText2, (USHORT) NULL, MB OK i MB ERROR ; MB MOVEABLE);
J /* if ADSNetDisconnect(ulNetConnect);
usTimer = WinStartTimer(hab, hundClient, TID_SCHEDULER DOtIN, FASTSCHEDREFRESH);
return(0);
/*
* JOBS, Edit job menu.
*/
case IDM_JOBEDIT: /*________________-________________________*/
tainDlgBox(HWNO DESKTOP, hand, (PFNWP)JobListDlgProc, (HMODULE)NULL, IDD_JOBLIST, NULL);
return(0);
/*
* JOBS, Schedule a job menu */
case IDM_JOBSCHEDULE: /*-------------------------------------*/
case ID_CLIENT_SCHED: /*-------------------------------------*/
WinDlgBox(HWND DESKTOP, hand, (PFNNP)DayTimerDlgProc, (HMODULE)NULL, IDD DAYTIMER, NULL);
return(0>;
/*
* JOBS, Reschedule selected job menu.
*/
case IDM_JOBRESCHED: /*--------------------------------------*/
case 1D CLIENT RESCHEO: /*-----------------------------------*/
if (GetSelectedItemString( hWnd, ID_CLIENT ADSLIST, JobRunID, JOBIDLENGTH, TRUE) < 0) return(0);
4linDlgBox(HWND DESKTOP, hwnd, (PFNWP)DayTimerDlgProc, (HMODULE)NULL, IDD DAYTIMER, (PVOID) JobRunID);
return(0);
/*
* JOBS, Rush selected job menu */
case IDM_JOBRUSH: /*_________________________________________*/
case ID_CLIENT_RUSH: /*--------------------------------------*/
if (GetSelectedItemString( hwnd, ID_CLIENT_ADSLIST, JobRunID, JOBIDLENGTH, TRUE) < 0) return(0);
RushJob(hwnd, JobRunID);
return(0);
/*
* JOBS, Zoom/Inspect menu */
case tDM_JOBZOOM: /*_________________________________________*/
case 1D CLIENT MGLASS: /*------------------------------------*/
if (GetSelectedltemString( hwnd, ID_CLIENT ADSLIST, JobRunID, JOBIOLENGTH, TRUE) < 0) return(0);
WinDlgBox(HWND DESKTOP, hand, (PFNNP)ZoomDlgProc, (HMODULE)NULL, IDD ZOOM, (PVOID) atol(JobRunID));
return(0);
/*
* JOBS, Hold this job menu */
case IDM_JOBHOLD: /*________________________________________-*/
case ID CLIENT STOPLIGHT: /*---------------------------------*/

4 6 ~~ '~ ~ , far if (GetSelectedItemString( hwnd) ID_CLIENT_ADSLIST, JobRunID, JOBIDLENGTH, TRUE) < 0) return(0);
SetUserRequest(hwnd, JobRunID, 'H');
return(0);
/*
* JOB, Resume this job menu */
case IDM_JOBRESUME: /*____________________-_______-__________*/
case ID_CLIENT_GOLIGHT: /*-----------------------------------*/
if (GetSelectedltemString( hwnd, ID_CLIENT_ADSLIST, JobRunID, JOBIDLENGTH, TRUE) < 0) return(0);
WinDlg8ox(HWND DESKTOP, hwnd, (PFN11P)ResumeDlgProc, (HMODULE)NULL, IDD RESUME, (PVOID) JobRunID);
return(0);
/*
* JOB, Cancel/delete this job menu */
case IDM_JOBCANCEL: /*_______________________________________*/
case ID_CLIENT_ERASER: /*------------------------------------*/
if (GetSelectedltemString( hwnd, ID CLIENT ADSLIST, JobRunID, J08IDLENGTH, TRUE) < 0) return(0);
SetUserRequest(hwnd, JobRunID, 'C');
SetActive0ptions(hwnd);
return(0);
/*
* VIEW, DEFAULT ; HISTORY ; ALL menu */
case IDM_VIEI~IDEFAULT: /*_____________________________________*/
case IDM_VIEWHISTORY: /*-------------------------------------*/
case IDM_VIEWALL: /*_________________________________________*/
hwndMenu = WiMdindowFromID(WinOueryNindow(hwnd, OW PARENT, FALSE), FID MENU);
/* Clear the old view menu checkmark */
N i nSenct~lsg ( hwnct~lenu, MM_SETITEMATTR, MPFROM2SHORT(sCurrentView, TRUE), MPFROM2SHORT(MIA CHECKED, 0));
/* Save the new view in the global */
sCurrentView = COMMANDMSG(&msg)->cmd;
/* Set the new view menu checkmark */
l1 i nSer>dlsg ( hwr>dhtenu, MM_SETITEMATTR, MPFROM2SHORT(sCurrentView, TRUE), MPFROM2SHORT(MIA CHECKED, MIA CHECKED));
IIinSencllsg(hwnd, IIM_T1MER, MPFROMSHORT(TID CLIENT REFRESH), OL);
/*
* Disable some of the buttons if this new view is not * the default. Also, take into account if a selection * has been made from the list box.
*/
SetActive0ptions(hwnd);
break;

~'~'~~..

/*
* VIEW, Filter menu.
*/
case IDM_FILTER: /*__________________________________________*/
llinDlgBox(H41ND DESKTOP, hwnd, (PFNWP)FilterOlgProc, (HMODULE)NULL, IDD_FILTER, NULL );
return(0);
/*
* HELP for HELP - We get to call it ourselves...
*/
case IDM_BA_HEL_HFH: /*______________________________________*/
winSer>d~lsg(hwndHelpInstance, HM DISPLAY HELP, OL, OL);
return (0);
J /* switch */
break;
/*
* Paint the client area, the button area, and the separator.
*/
case 41M PAINT: /*______________________________________________________*/
/* Calc button size */
cyButton = (USHORT) NinGuerySysValue(HSINO DESKTOP, SV CYICON) + 16;
hps = WinBeginPaint(hwnd, NULL, NULL);
/* Fill everything but button area with background color. */
WinOueryllindowRect(hwnd, &rectl);
rectl.yBottom = cyButton + 2 * BUTTONVERTSEP;
NinFillRect(hps, 8rectl, SYSCLR BUTTONMIDDLE);
/* Fill button area with grey */
rectl.yTop = rectl.yBottom;
rectl.yBottom = 0;
WinFillRect(hps, &rectl, SYSCLR BUTTONMIDDLE);
/* Draw separator line */
ptl.x = 0;
ptl.y = rectl.yTop;
GpiMove(hps, &ptl);
ptl.x = rectl.xRight;
GpiSetColor(hps, SYSCLR WINDOWTEXT);
GpiLine(hps) &ptl);
WinEndPaint(hps);
return(0);
/* Required multicolumn list stuff */
case lM_MEASUREITEM: /*________________________________________________*/
switch (SHORT1FROMMP(mp1)) i case IO_CLIENT_ADSLiST: /*_______________________________________*/
return (MRFROMLONG(ADSLBMeasure(hwnd, ID_CLIENT ADSLIST, SHORT1FROMMP(mp2), aLColWidth, CLIENT COLUMNS, ID_CLIENT_HEADING, szNeadingTop, szHeadingeottom)));
J /* switch */
return(0);
/* Ditto */
case HM DRANITEM: /*-__________________________________________________*/
switch (SHORT1FROMMP(mp1)) <
case ID_CLIENT_ADSLIST: /*_______________________________________*/
ADSLBDraw(hwnd, ID_CLIENT_ADSLIST, (POWNERITEM)PVOIDFROlMIP(mp2), alColWidth, CLIENT_COLUMNS, tD CLIENT HEADING, FALSE);
return (MRFROMSHORT(TRUE));

~s /* switch */
return(0);
/* KEYS HELP */
case HM_QUERY_KEYS_HELP: /*--------------------------------------------*/
return(MRFROMSHORT(IDH BA HEL SC HELPKEYS));
/* switch return Wi MefWindowProc(hwnd, msg, mpl, mp2);
/* C l i entllndProc */
/*__________________________________________________________________________*/
/* wpSCFrame - Subclassed Frame Procedure */
/*__________________________________________________________________________*/
MRESULT EXPENTRY wpSCFrame(HwNO hwnd, USHORT msg, MPARAM mpl, MPARAM mp2)( static PFN41P OldProc;
switch(msg)C
case 41M USER: /*-___________________________________________________*/
OldProc = (PFNWP)PVOIDFROMMP(mp1);
return 0;
break;
case HM OUERYTRACKINFO:C /*_________________________________________*/
PTRACKINFO pti;
MRESULT mr;
pti = PVOIDFROMMP(mp2);
mr = OldProc(hwnd, msg, mpl, rnp2);
pti->ptlMinTrackSize.x =
NinGuerySysValue(HwND DESKTOP, SV CXICON) * 12;
pti->ptlMinTrackSize.y =
4linGuerySysValue(HWND DESKTOP, SV CYICON) * 7;
return mr;
break;
/* switch */
return OldProc(hwnd, msg, mpl, mp2);
/* wpSCFrame */
/**************************************xx*****x************************x*xx**x/

/* */
/* ExecuteOlgProc */
/* */
/* This dlgproc allows the batch administrator to maintain the registered */
/* executable list. An executable roust be registered before it can be */
/* used in a Batch Job. Table: SSAvailProgramTable */
/* */
/x*t******************************x*x*****x****x*************x****************/

MRESULT EXPENTRY ExecuteDlgProc(HlIND hwnd, USHORT msg, MPARAM mpl, MPARAM
mp2) C
static CHAR szHeadingTopI807;
static CHAR szHeadingBottom(807;
static LONG alColWidthIEXEDLG COLUMNS7;
USHORT i;

USHORT usNotifyCode;

CHAR abBuffer(250J;

DBCHAR ProgramNamefEXECUTENAMELENGTH7;

DBCHAR FileName(EXECUTEFILELENGTH7;

static usPushButtonsfEXECUTENUMBUTTONS7;
USHORT

USHORT fDelete;

a switch (msg) C
case bM CONTROL: /*____________________________________________________*/
usNotifyCode = (USHORT) SHORT2FROMMP(mp1);
switch (SHORT1FROMMP(mp1)) case DID_EXECUTE_ADSLIST: /*---------------------------------__--*/
switch (usNotifyCode) C
/*
* If a list item is selected, query the data and fill * in the entry fields.
*/
case LN_SELECT: /*_________________________________________*/
if (GetSelectedItemString(hwnd, DID_EXECUTE_ADSLIST, ProgramName, sizeof(ProgramName), TRUE) < 0) return(O);
NinSetPointer(HWND DESKTOP, WinOuerySysPointer(HWND DESKTOP, SPTR WAIT, TRUE));
safe dbfcmd(dbproc, "SELECT"
" ProgramName,"
" AvailProgramFileName"
" FROM SSAvailProgramTable"
" WHERE ProgramName LIKE \"Xs\""
" ORDER 8Y ProgramName", ProgramName);
dbsqlexec(dbproc);
dbresults(dbproc);
dbbind(dbproc, 1, NTBSTRINGBIND, (LONG)sizeof(ProgramName), ProgramName);
dbbind(dbproc, 2) NTBSTRINGBIND, (LONG)sizeof(FileName), FileName);
dbnextrow(dbproc);
WinSetDlgItemText(hwnd, DID_EXECUTE_PROGNAME, ProgramName);
WinSetDlgItemText(hwnd, DID_EXECUTE_PROGFILE, FileName);
SetPushButtons(hwnd, EXECUTENUMBUTTONS, DiD_EXECUTE CLEAR, usPushButtons);
fDelete = TRUE;
if (!strcmpi(FileName, "RESETRPT.EXE")) fDelete = FALSE;
if (!strcmpi(FileName, "SGR.EXE")) fDelete = FALSE;
if (!strcmpi(FileName, "NPRINT.EXE")) fDelete = FALSE;
if (!strcmpi(FileName, "GLPOST.EXE")) fDelete = FALSE;
if (!strcmpi(FileName, "ACTRJE.EXE")) fDelete = FALSE;
WinEnableHindow(WinHindowFromID(hwnd, DID EXECUTE DELETE), f0elete);
dbcanquery(dbproc);
while (dbresults(dbproc) != NO MORE RESULTS) dbcartquery( dbprx );
NinSetPointer(HWND_DESKTOP, HinCuerySysPOinter(HWND DESKTOP, SPTR ARR011, TRUE));
break;
/* switch */
break;
/* switch */
break;

case HM_INITDLG: /*____________________________________________________*/
/*
* Change pointer to hourglass.
*/
HinSetPointer(HIIND DESKTOP, 4lir>DuerySysPointer(HWND DESKTOP, SPTR WAIT, TRUE));
/*
* Load the column title strings from the resource.
*/
4linLoadString(hab, (HMODULE)NULL, IDS EXECUTE LIST1 TOP, sizeof(szHeadingTop), (PSZ)szHeadingTop);
WinLoadString(hab, (HMODULE)NULL, IDS_EXECUTE_LIST1_BOT, sizeof(szHeadingBottom), (PSZ)szHeadingBottom);
/* Clear colurtn widths */
for (i = 0; i < EXEDLG COLUMNS; i++) alColWidthlil = 0;
/* Store button ids and set default */
usPushButtonsl0l = DID_EXECUTE_CLEAR;
usPushButtonsll) = DID_EXECUTE INSERT;
usPushButtons(2I = DID EXECUTE DELETE;
usPushButtonsC3) = DID OK;
/* Set Maximum entry field lengths */
4linSer>dDlgItemMsg(hwnd, DID_EXECUTE_PROGNAME, EM SETTEXTLIMIT, MPFROMSHORT(EXECUTENAMELENGTH - 1), OL);
WinSend4lgltemMSg(hwnd, DID_EXECUTE_PROGFILE, EM SETTEXTLIMIT, MPFROMSHORT(EXECUTEFILELENGTN - 1), OL);
/* Load the listbox with the executables */
LoadListBox(hWnd, DID EXECUTE ADSLIST, (PSZ)NULL, (PSZ)NUII, 0);
SetPushButtons(hwnd, EXECUTENUMBUTTONS, DID EXECUTE_INSERT, usPushButtons);
WinSetFocus(HWND DESKTOP, Hir><IindowFromID(hwnd, DID_EXECUTE_PROGNAME));
HinEnableWindow(WinblindowFromID(hwnd, DID EXECUTE DELETE), FALSE);
/* Restore the pointer. */
llinSetPointer(HWND DESKTOP, WinGuerySysPointer(H41ND DESKTOP, SPTR ARROW, TRUE));
return(0);
/* Multicolumn List box stuff */
case HM MEASUREITEM: /*-_______________________________________________*/
switch (SHORT1FROMMP(mp1)) case DID_EXECUTE_ADSLIST: /*-------------------------------------*/
return (MRFROMLONG(ADSLBMeasure(hwnd, DID_EXECUTE ADSLIST, SHORT1FROMMP(mp2), alColWidth, MCHDLG COLUMNS, DID_EXECUTE_HEADING, szHeadingTop, szHeadingBottom)));
/* switch */
return(0);
case NM DRAHITEM: /*___________________________________________________x~
switch (SHORT1FROI~IP(mp1)) C
case DID_EXECUTE_ADSLIST: /*-------------------------------------*/
ADSLBDraw(hwnd, DID_EXECUTE_ADSLIST, (POIINERITEM)PVOIDFROMMP(mp2), alColWidth, MCHDLG_COLUMNS, DID EXECUTE HEADING, FALSE);
return (MRFROMSHORT(TRUE));
/* snitch */
return(0);

rf case WM_COMMAND: /*____-_________________________________-_____________*/
switch (COMMANDMSG(&msg)->cmd) case DID_OK: /*__________________________________________________*/
WinDismissOlg(hwnd, TRUE);
return(0);
/*
* CLEAR BUTTON - Clear the entry fields and the listbox selection */
case DID_EXECUTE_CLEAR: /*---------------------------_-----___--_*/
WinSendDlgItemMsg(hwnd, DID EXECUTE ADSLIST, LM_SELECTITEM, (MPARAM)LIT NONE, OL);
WinSetDlgItemText(hwnd, DID_EXECUTE_PROGNAME, "");
WinSetDlgItemText(hwnd, DID_EXECUTE_PROGFILE, "");
SetPushButtons(hwnd, EXECUTENUMBUTTONS, DID EXECUTE-INSERT, usPushButtons);
WinSetFocus(HWNO DESKTOP, WinWindowFromID(hwnd, DID_EXECUTE_PROGNAME));
WinEnableWindow(WinWindowFromID(hwnd, DID EXECUTE DELETE), FALSE);
return(0);
/*
* INSERT BUTTON - Get data from the entry fields and insert * a new record.
*/
case DID_EXECUTE_INSERT: /*--------------------------------------*/
if (!WinGueryDlgItemText(hwnd, DID_EXECUTE_PROGNAME, EXECUTENAMELENGTH, ProgramName)) return(0);
if (!WinOueryDlgItemText(hwnd, DID_EXECUTE_PROGFILE, EXECUTEFILELENGTH, FileName)) return(0);
WinSetPointer(HWND DESKTOP, WinOuerySysPointer(HWND DESKTOP, SPTR WAIT, TRUE));
safe_dbfcmd(dbproc, " INSERT into SSAvailProgramTable"
" VALUES (\"Xs\". \"%s\")", ProgramName, FileName);
if (dbsqlexec(dbproc)) l dbcanquery(dbproc);
while (dbresults(dbproc) != NO MORE RESULTS) dbcanquery(dbproc);
WinSetDlgItemText(hwnd, DID_EXECUTE_PROGNAME, "");
WinSetDlgItemText(hwnd, DID_EXECUTE_PROGFILE, "");
LoadListBox(hwnd, DID EXECUTE ADSLIST, (PSZ)NULL, (PSZ)NULL, 0);
SetPushButtons(hwnd, EXECUTENUMBUTTONS, DID EXECUTE_INSERT, usPushButtons);
WinSetFocus(HWND DESKTOP, Wir><lindowFromID(hwnd, DID_EXECUTE_PROGNAME));
WinEnableWindow(WinWindowFromID(hwnd, DID EXECUTE DELETE), FALSE);
J /* i f */
else ADSMsgBox(dbproc, ALRDY EXST, NULL, ProgramName);
dbcanquery(dbproc);
while (dbresults(dbproc) != NO MORE RESULTS) dbcanquery(dbproc);

WinSetPointer(HWND DESKTOP) WinOuerySysPointer(HWND DESKTOP, SPTR ARROW, TRUE));
return (0);
/*
* DELETE BUTTON - Delete the current item but leave the * data in the entry field to allow an undo.
*/
case DID_EXECUTE_DELETE: /*--------------------------------------*/
if (GetSelectedItemString( hwnd, DID_EXECUTE_ADSLIST, abBuffer, EXECUTENAMELENGTH, TRUE) < 0) return(0);
WinSetPointer(HWND DESKTOP, WinauerySysPointer(HWND DESKTOP, SPTR WAIT, FALSE));
safe_dbfcmd(dbproc) " DELETE SSAvailProgramTable"
" WHERE ProgramName = \"Ys\"", abeuffer);
dbsqlexec(dbproc);
dbcanquery(dbproc);
while (dbresults(dbproc) != NO MORE RESULTS) dbcanquery(dbproc>;
WinSetDlgItemText(hwnd, DID_EXECUTE_PROGNAME, "");
WinSetDlgItemText(hwnd, DID_EXECUTE_PROGFILE, "");
LoadListBox(hwnd, DID EXECUTE ADSLIST, (PSZ)NULL, (PSZ)NULL, 0);
SetPushButtons(hwnd, EXECUTENUMBUTTONS, DID EXECUTE-INSERT, usPushButtons);
WinSetFocus(HWND DESKTOP) WirrilindowFromID(hwnd, D1D_EXECUTE_PROGNAME));
WinEnableWindow(WinWindowFromlD(hwnd, DID EXECUTE DELETE), FALSE);
WinSetPointer(HWND DESKTOP, WinOuerySysPointer(HWND DESKTOP, SPTR ARROW, FALSE));
return (0);
) /* switch */
break;
/* switch */
return WinDefDlgProc(hwnd, msg, mpt, mp2);
/* ExecuteDlgProc */
/*__________________________________________________________________________*/
/* dpMachine - Maintain SSMachineTable and SSGrpMachineTable (jdb) */
/*__________________________________________________________________________*/
typedef struct _MACHINEDATA( /* for use with dpMachine, */
CHAR achMachineNameLlS+17; /* and dpMachineDetail_ */
CHAR achMachineDescrl80+17;
USHORT usMaxJobs;
)MACHINEDATA, *PMACHINEDATA;
MRESULT EXPENTRY dpMachine(HWND hwnd, USHORT msg, MPARAM mpl, MPARAM mp2)C
#define ACHBIND(n,a) dbbind(dbproc,n,NTBSTRINGBIND,sizeof(a),a) #define SHORTBIND(n,a) dbbind(dbproc,n,SMALLBIND,2,(PBYTE)&a) #define MACHINELISTBUFSIZE 15+1+80+1 #define UM FILLMACH1NELIST WM USER

_,~~ .~

/*______________________________________________________________________*/
/* Multi-Column Listbox stuff */
/*______________________________________________________________________*/
#define HEADER_TOP "Workstation\tWorkstation"
#define HEADER_BOTTOM "Name\tDescription"
#define NUMBER_OF_COLUMNS 2 static ULONG alCol4lidth(NUMBER OF COLUMNS);
switch(msg)C
case WM_INITDLG: /*_________________________________________________*/
WinSend~lsg(hwnd, UM_FILLMACHINELIST, 0, 0);
WinSetFocus(HWND DESKTOP, Win4lindowFromID(hwnd, IDD_MACHINES LIST));
break; -case UM_FILLMACHINELIST:C /*----------------------------------------*/
MACNINEDATA mdata;
CHAR bufferIMACHINELISTBUFSIZE);
RETCODE rc;
WinSendolgItemMsg(hwnd, IDD MACHINES LIST, LM DELETEALL, 0, 0);
WinSer~lgltemMsg(hwnd, IDD_MACHINES_LtST, LM_INSERTITEM, MPFROMSHORT(LIT_END), MPFROMP("<NEW>\tDefine a new workstation"));
dbcmd(dbproc, " SELECT"
" MachineName,"
" MachineDescr,"
MaxJobs"
" FROM SSMachineTable"
" ORDER BY MachineName");
dbsqlexec(dbproc);
while((rc=dbresults(dbproc)) != NO MORE RESULTS)( if(rc==SUCCEED)( ACHBIND(l,mdata.achMachineName);
ACHBIND(2,mdata.achMachineDescr);
SHORTBIND(3,mdata.usMaxJobs);
while(dbnextrow(dbproc)!=NO MORE ROWS)( HWND hwndList;
USHORT index;
hwndList = WinWindowFromID(hwnd, IDD MACHINES LIST);
strcpy(buffer, mdata.achMachineName);
strcat(buffer, "\t");
strcat(buffer, mdata.achMachineDescr);
index = SHORT1FROMMR(WinSenct~lsg(hwndList, LM_INSERTITEM, MPFROMSHORT(LIT END), MPFROMP(buffer)));
WinSer>~lsg(hwndList, LM SETITEMHANDLE, MPFROMSHORT(index), MPFROMSHORT(mdata.usMaxJobs));
) /* while */
/* i f */
/* while */
WinEnableWindow(WinWindowFromID(hwnd, IDD_MACHINES_MOD1FY), FALSE);
WinEnableWindow(WinWindowFromID(hwnd, IDD MACHINES DELETE), FALSE);
break;
case WM_CONTROL: /*-________________________________________________*/
switch(SHORT1FROMMP(mp1))C
case IDD MACHINES LIST: /*----------------------------------*/

switch(SHORT2FROMMP(mp1))( case LN_SELECT:C /*_________________________________*/
USHORT index;
BOOL bModify, bDelete, bDefault;
HNND hwndList;
hwndList = WinWindowFromlD(hwnd, IDD_MACHINES_LIST);
if ((index=SHORT1FROMMR(WinSendMsg( hwndList, LM_OUERYSELECTION, MPFROMSHORT(LIT_FIRST), 0) )) != LIT NONE) C _ if (SHORT1FROMMR( WinSendMsg( hwndList, LM_OUERYSELECTION, MPFROMSHORT(index), 0) ) != LIT_NONE) ( /* 2 items or more */
bModify = FALSE;
bDelete = TRUE;
bDefault = IDD MACHINES DELETE;
l /* if *~
else C /* 1 item selected */
bModify = TRUE;
bDelete = TRUE;
b0efault = IDD MACHINES MODIFY;
/* else *~
J /* i f */
else ( /* No item selected */
bModify = FALSE;
bDelete = FALSE;
bDefault = IDD MACHINES LIST;
J /* else *~
NinEnabteuirxJow(llinidindowFromID(hwnd, IDD_MACHINES_MODIFY), bModify);
WinEnableWindow(WinllindowFromID(hwnd, IDD_MACHINES_DELETE), bDelete);
WinSer>d~lsg(Wir>WindowFromID(hwnd, bDefault), BM SETDEFAULT, (MPARAM)TRUE, NULL);
break;
case LN_ENTER: /*___________________________________*/
WinSer>dDlgItemMsg(hwnd, IDD MACHINES MODIFY, BM CLICK, 0, 0);
break;
J /* switch */
break;
7 /* switch */
break;
case MA_COMMAND: /*_________________________________________________*/
switch(SHORT1FROMMP(mp1))C
case IDD_MACHINES_MOOIFY:i /*-------------------------------*/
MACHINEDATA Mdat;
USHORT index, i;
H11ND hwndList;
CHAR buffer(MACHINELISTBUFS12E);
hwndlist = WiMlindowFromID(hwnd, IDD MACHINES LIST);
index = SHORT1FROMMR( WinSendAsg(hwndList, LM_OUERYSELECTION) MPFROMSHORT(LIT_FIRST), 0));
WinSendhisg(hwndList, LM_OUERYITEMTEXT, MPFROM2SHORT(index, MACHINELISTBUFSI2E), MPFROMP(buffer));

rt.i ..W::~ a _..

for(i=0; bufferLi7!='\t'; i++); /* Find TAB in buffer */
bufferli++7=0; /* Terminate at TAB */
strcpy(Mdat.achMachineName, buffer);
strcpy(Mdat.achMachineDescr, buffer+i>;
Mdat.usMaxJobs = SHORT1FROMMR( NinSendMsg(hwndList, LM ~UERYITEMHANDLE, MPFROMSHORT(index), 0));
if (index == 0) Mdat.achMachineNamel07 = 0;
if (WinDlgBox(HWND DESKTOP, hwnd, (PFNWP)dp4lSDetail, (HMODULE)NULL, IDD_WS DETAILS, BMdat) _-DID_WSDETAIL_COMMIT) WinSendMsg(hwnd, UM_FILLMACHINELIST, 0, 0);
else WinSencJwlsg(hwndList, LM SELECTITEM, MPFROMSHORT(index), MPFROMSHORT(FALSE));
WinSetFocus(HWND DESKTOP, hwndList);
return 0;
break;
case IDD_MACHINES_DELETE: /*--------------------------------*/
if(WiMlessageBox(HWND_DESKTOP, hwnd, "Are you sure "
"you want to delete marked workstations? Press "
"'Yes' to commit this change.", "Commit?", 1, MB YESNO ; M8_ICONEXCLAMATION) _= MB1D YES) USHORT index, i;
HNND hwndList;
CHAR bufferfMACHINELISTBUFSIZEI;
hwndList = WinWindowFromID(hwnd, IDD MACHINES LIST);
index = SHORT1FROMMR( WinSend'1sg(hwndList, LM ~UERYSELECTION, MPFROMSHORT(LIT_FIRST), 0) );
while(index != LIT_NONE)C
WinSencJllsg(hwndList, LM_CUERYITEMTEXT, MPFROM2SHORT(index, MACHINELISTBUFSIZE), MPFROMP(buffer));
for(i=0; bufferli7!='\t'; i++)~
buffer(i++7=0;
dbfcmd(dbproc, " DELETE SSMachineTable"
" WHERE MachineName = \"Xs\"", buffer);
dbsqlexec(dbproc);
while(dbresults(dbproc) != NO_MORE_RESULTS);
index = SHORT1FROMMR( uinSenct~isg(hwndList, LM_OUERYSELECTION, MPFROMSHORT(index), 0));
/* while */
WinSend~tsg(hwnd, UM_FILLMACHINEL1ST, 0, 0);
WinSetFocus(HWND DESKTOP, hwndList);
return 0;
/* if */
break;
/* switch */
break;
/*__________________________________________________________________*/
/* Multi-Column Listbox stuff */
/*__________________________________________________________________*/
case 41M MEASUREITEM: /*-____________________________________________*/
return (MRFROMLONG(ADSLBMeasure(hwnd, tDD MACHINES LIST, ~~ ~~ "~ .
_57_ if(pMdat->achMachineNamelOl)C
WinSetDlgItemText(hwnd, D1D WSDETAIL MACHINENAME, pMdat->achMachineName);
4linEnable4lindow(WinWindowFromID(hwnd, DID_HSDETAIL_MACHINENAME), FALSE);
HinSetDlgItemText(hwnd, DID WSDETAIL DESCRIPTION, pMdat->achMachineDescr);
#if 0 Requires OS/2 2.0 NinSendolgItemMsg(hwnd, DID_USDETAIL_MAXJOBS, SPBM SETCURRENTVALUE, MPFROMSHORT(pMdat->usMaxJobs), 0);
#endif WinSetDlgItemShort(hwnd, DID 41SDETAIL MAXJOBS, pMdat->usMaxJobs, FALSE);

l /* if */

dbfcmd(dbproc, " CREATE TABLE #batchtemp("

" Member char(3),"

" GrpName char(25),"

" GrpDescr char(80)"

" INSERT INTO #batchtemp"

" SELECT"

~i rNoi~n " GrpName,"

" GrpOescr"

" FROM SSGrpTable"

" UPDATE #batchtemp"

" SET"

a.Member = 'Yes "' " FROM #batchtemp a, b"
SSGrpMachineTable " WHERE a.GrpName = b.GrpName"

" AND b.MachineHame =
\"%s\""

" SELECT"

" Member "

" GrpName,"

" GrpDescr"

" FROM #batchtemp"

" ORDER BY GrpName"

" DROP TABLE #batchtemp", pMdat->achMachineName);

dbsqlexec(dbproc);

if((dbresults(dbproc) /* create _= SUCCEED) */

8& (dbresults(dbproc) /* insert _= SUCCEED) */

&& (dbresults(dbproc) /* update _= SUCCEED) */

&& ((dbresults(dbproc>) /* select _= SUCCEED))C */

ACHBIND(t,achMember);

ACHBIND(2,achGrpName);

ACHBINO(3,achGrpOescr);

while(dbnextrow(dbproc) != NO MORE ROWS)C
if(!WinIsWindowEnabled(hwndList))C
WinEnableHindow(hwndList, TRUE);
uinSenci~lsg(hwndList, LM DELETEALL, 0, 0);
7 /* if *%
strcpy(buffer, achMember);
if(bufferlOJ=='N') strcat(buffer, " ");
strcat(buffer, "\t");
strcat(buffer, achGrpName);
strcat(buffer, "\t");

°

~ ''~~.~~,r rJ ..~.. ~ 7 ;i :f _58_ strcat(buffer, achGrpDescr);
WinSendMsg(hwndList, LM_INSERTITEM, MPFROMSHORT(LIT END), MPFROMP(buffer));
/* while *%
/* if */
while(dbresults(dbproc)!= NO MORE RESULTS);
WinEnableWindow(WinWindowFromID(hwnd, D1D WSDETAIL COMMIT), FALSE);
WinSetWindowPtr(hwnd, AWL USER, pMdat); /* Store Buffer address */
if(!WinIsWindowEnabled(WinWindowFromID(hwnd, DID_WSDETAIL_MACHINENAME))) WinSetFocus(HWND DESKTOP, WinWindowFromID(hwnd, DID_WSDETAIL_DESCRIPTION));
return MRFROMSHORT(TRUE);
/* if */
break;
case UM_SETBUTTONSTATES: /*-----------------------------------------*/
if( WinOueryWindowTextLength( WinWindowFromID( hwnd, DID_WSDETA1L_MACHINENAME)) 88 WinOueryWindowTextLength( WinWindowFromlO( hwrxJ, DID WSDETAIL DESCRIPTION)) )( _ _ WinEnableWindow(WinWindowFromID(hwnd, DID_WSDETAIL COMMIT), TRUE);
/* if *%
else( WinEnableWindow(WinuindowFromID(hwnd, DID WSDETAIL COMMIT), FALSE);
/* else *~
break;
case WM_CONTROL: /*-________________________________________________*/
switch(SHORT1FROMMP(mp1))( case DID_WSDETA1L_GROUPLIST: /*-----------------------------*/
switch(SHORTZFROMMP(mpt))( case LN_SELECT:f /*_________________________________*/
CHAR bufferIGROUPLISTBUFSIZE7;
HWND hwndList;
USHORT index;
WinSencltsg(hwnd, UM_SETBUTTONSTATES, 0) 0);
hwndList = WinWindowFromID(hwnd, DID_WSDETAIL_GROUPLIST);
WinEnableWindowUpdate(hwndList, FALSE);
index = SHORT1FROMMR( WinSendAsg(hwndList, LM_OUERYSELECTION, MPFROMSHORT(LIT_FIRST), 0) );
WinSend~lsg(hwndlist, LM_OUERYITEMTEXT) MPFROM2SHORT(index,GROUPLISTBUFSIZE)) MPFROMP(buffer));
if(buffer(O7=='Y'> merticpy(buffer, "NO ", 3>;
else memcpy(buffer, "Yes", 3);
WinSendlsg(hwndList, LM SETITEMTEXT, MPFROMSHORT(index), MPFROMP(buffer));
WinSenci~lsg(hwndList, LM SELECTITEM, MPFROMSHORT(index), MPFROMSHORT(FALSE));
WinEnableWindouUpdate(hwndList, TRUE);
break;
/* switch */

break;
case DID_WSDETAIL_MACHINENAME: /*--------------------------_*/
case DID_WSDETAIL_DESCRIPTION: /*--------------------------_*/
case DID_WSDETAIL_MAXJOBS: /*---------------------------_---*/
switch(SHORT2FROMMP(mp1))( case EN CHANGE: /*__________________________________*/
#i f 0 Requires OS/2 2.0 #endif case SPBN CHANGE: /*_________________________-______*/
NinSendASg(hwnd, UM SETBUTTONSTATES, 0, 0);
break;
/* switch */
break;
/* switch */
break;
case WM COMMAND: /*-______________________________-_________________*/
switch(SHORT1FROMMP(mp1))( case DID_41SDETAIL_COMMIT:C /*-------------------------------*/
PMACHINEDATA pMdat;
CHAR bufferIGROUPLISTBUFSI2E);
HWND hwndlist;
INT i, iCount, index;
pMdat = NinOueryllindowPtr(hwnd, AWL_USER);
WinOueryDlgItemText(hwnd, DID_WSDETAIL_MACHINENAME, sizeof(pMdat->achMachineName), pMdat->achMachineName);
WinOueryDlgItemText(hwnd, DID WSDETAIL DESCRIPTION, sizeof(pMdat->achMachineDescr), pMdat->achMachineDescr);
#i f 0 Requires OS/2 2.0 WinSerx;()lgltemMsg(hwnd, DID_WSDETAIL_MAXJOBS, SPBM QUERYVALUE, MPFROMP(&ulTemp), 0);
#endif 41in0ueryDlgItemShort(hwnd) DID WSDETAIL MAXJOBS, &pMdat->usMaxJObs, FALSE);
/*______________________________________________________*/
/* Insert or Update rows in SSMachineTable */
/*_________________-_-____________-_____________________*/
if(11in1sWindowEnabled(WinlJindowFromID(hwnd, DID_WSDETAIL_MACHINENAME)))C
safe_dbfcmd(dbproc, " INSERT INTO SSMachineTable("
" MachineName,"
" Machine0escr,"
" MaxJobs,"
" JobCnt"
" VALUES("
\"Xs\","
a \nXs\"gin yd ~~
a pu a )u~
pMdat->achMachineName, pMdat->achMachineDescr) pMdat->usMaxJobs);
/* i f */
else( safe_dbfcmd(dbproc, " UPDATE SSMachineTable"
" SET"

~. ~~~_~7 " MachineDescr = \"Ys\","
" MaxJobs = Y.d"
" WHERE MachineName = \"Ys\"", pMdat->achMachineDescr, pMdat->usMaxJobs, pMdat->achMachineName);
/* else */
dbsqlexec(dbproc);
while(dbresults(dbproc) != NO MORE RESULTS);
/*______________________________________________________*/
/* Make coresponding changes to SSGrpMachineTable */
/*______________________________________________________*/
hwndList = WinNindowFromID(hwnd, OID_41SDETAIL GROUPLIST);
iCount = SHORT1FROMMR(WinSendMsg(hwndList, LM_OUERYITEMCOUNT, 0, 0));
for(index=0; index<iCount; index++)C
uinSendMsg(hwndList, LM_QUERYITEMTEXT, MPFROM2SHORT(index, GROUPLISTBUFSIZE), MPFROMP(buffer));
for(i=4; buffer(i7!='\t'; i++);
bufferli7=0;
if(bufferl07=='Y')( dbfcmd(dbproc, " INSERT INTO SSGrpMachineTable"
" (GrpName) MachineName)"
" VALUES(\"Xs\". \"Xs\")°, buffer+4, pMdat->achMachineName);
/* if */
else( dbfcmd(dbproc, " DELETE SSGrpMachineTable"
" WHERE GrpName = \"%s\""
" AND MachineName = \"Xs\"", buffer+4, pMdat->achMachineName);
/* else */
dbsqlexec(dbproc);
while(dbresults(dbproc) != NO MORE RESULTS);
/* for *~
break;
/* switch */
break;
/*__________________________________________________________________*/
/* Multi-Column Listbox stuff */
/*__________________________________________________________________*/
case LM_MEASUREITEM:( /*____________________________________________*/
MRESULT mr;
aLColHidthl07=0;
mr = MRFROMLONG(ADSLBMeasure(hwnd, DID_41SDETAIL_GROUPLIST, SHORT1FROMMP(mp2), alColNidth, NUMBER_OF_COLUMNS, DID_WSDETAIL GROUPLISTHEADER, HEADER TOP, HEADER BOTTOM));
return(mr);
break;
case NM_DRAW1TEM: /*________________________________________________*/
ADSLBDraw(hwnd, DID_WSDETAIL_GROUPLIST, (POWNERITEM)PVOIDFROMMP(mp2), aICoIWidth, NUMBER_OF_COLUMNS, DID HSDETAIL GROUPLISTHEADER, FALSE);
return (MRFROMSHORT(TRUE));
break;
/* switch */

return uinDefDlgProc(hwnd, msg, mpl, mp2);
#undef GROUPLISTBUFSIZE
#undef HEADER_TOP
#undef HEADER_BOTTOM
#undef NUMBER_OF_COLUMNS
> /* dpWSDetail */
/*__________________________________________________________________________*/
/* dpGroup - Maintain SSGrpTable and SSGrpMachineTable (jdb) */
/*__________________________________________________________________________*/
typedef struct _GROUPDATA( /* for use with dpGroup, */
CHAR achGroupName(25+17; /* and dpGroupDetail. */
CHAR achGroupDescr(80+17;
)GROUPDATA, *PGROUPDATA;
MRESULT EXPENTRY dpGroup(HWND hwnd, USHORT msg, MPARAM mpl, MPARAM mp2)C
#define GROUPLISTBUFSIZE 25+I+80+~
#define UM FILLGROUPL1ST bM USER
/*______________________________________________________________________*/
/* Multi-Colurtn Listbox stuff */
/*______________________________________________________________________*/
#define HEADER_TOP "Group\tGroup"
#define HEADER_BOTTOM "Name\tDescription"
#define NUMBER_OF_COLUMNS 2 static ULONG alColWidth(NUMBER OF COLUMNS7;
switch(msg)( case NM INITDLG: /*-________________________________________________*/
NinSend'Isg(hwnd, UM_FILLGROUPLIST, 0, 0);
WinSetFocus(HWND DESKTOP, Wir~indowFromID(hwnd, IDO GROUPS-LIST));
break;
case UM_FILLGROUPLIST:( /*__________________________________________*/
GROUPDATA gdata;
CHAR buffer(GROUPLISTBUFS1ZE7;
RETCODE rc;
WinSerxblgItemMsg(hwnd, IDD GROUPS LIST) LM DELETEALL, 0, 0);
4linSer>dDlgItertMsg(hwnd, 1DD GROUPS LIST, LM_INSERTITEM, MPFROMSHORT(LIT_END), MPFROMP("<NEW>\tDefine a new group"));
dbcmd(dbproc, " SELECT"
" GrpName,"
" GrpDescr"
" FROM SSGrpTable"
" ORDER BY GrpName");
dbsqlexec(dbproc);
while((rc=dbresults(dbproc)) != NO MORE RESULTS)( if(rc==SUCCEED)( ACHBIND(l,gdata.achGroupName);
ACMBIND(2,gdata.achGroupDescr);
while(dbnextrow(dbproc)!=NO MORE RONS)( HWND hwndList;
USHORT index;
hwndList = NinHindowFromID(hwnd, IDD_GROUPS LIST);
strcpy(buffer, gdata.achGroupName);

strcat(buffer, ~~\t~~);
strcat(buffer, gdata.achGroupDescr);
index = SHORT1FROMMR(HinSenct~lsg(hwndList, LM_INSERTITEM, MPFROMSHORT(LIT END), MPFROMP(buffer)));
/* while */
/* if */
/* while */
uinEnableWindow(WinNindowFromID(hwnd, IDD_GROUPS_MODIFY), FALSE);
UinEnableWindow(NinNindowFromID(hwnd, IDD GROUPS DELETE), FALSE);
break;
case NM_CONTROL: /*_________________________________________________*/
switch(SHORT1FROMMP(mp1))( case IDD_GROUPS_LIST: /*____________________________________*/
switch(SHORT2FROMMP(mp1))( case LN_SELECT:C /*_________________________________*/
USHORT index;
BOOL bModify, bDelete, bDefault;
HWND hwndlist;
hwndList = 4liMlindowFromID(hwnd, IDD_GROUPS_LIST);
if ((index = SHORT1FROMMR(WinSencMsg(hwndList, LM_~UERYSELECTION, MPFROMSHORT(LIT_FIRST), 0))) != LIT HONE) C _ if (SHORT1FROMMR(WinSendAsg(hwndList, LM_QUERYSELECTION, MPFROMSHORT(index), 0)) != LIT_NONE) C /* 2 items or more */
bMOdify = FALSE;
bDelete = TRUE;
bDefault = IDD GROUPS DELETE;
/* i f *~
else C /* t item selected */
bModify = TRUE;
bDelete = TRUE;
bDefault = IDD GROUPS MODIFY;
/* else *~
/* if */
else ( /* No item selected */
bModify = FALSE;
bDelete = FALSE;
bDefault = IDD GROUPS LIST;
/* else *~
WinEnableuindow(WiMlindowFramID(hwnd, IDD_GROUPS_MODIFY), bModify);
HinEnableWindow(WiM~lindowFranID(hwnd, IDD_GROUPS_DELETE), b0elete);
WinSendAsg(WinhlindowFromID(hwnd, b0efault), BM SETDEFAULT, (MPARAM)TRUE, NULL);
1 break;
case LN_ENTER: /*___________________________________*/
WinSer~lgltemMsg(hwnd, IDD GROUPS MODIFY, BM CLICK) 0, 0);
break;
/* switch */
break;

1~ .~ 6~ ~ ~. a .~:J _,v C:

7 /* suitch */
break;
case 4fM COMMAND: /*-________________________________________________*/
switch(SHORT1FROMMP(mp1))C
case IDD_GROUPS_MODIFY:~ /*--------------------------_------*/
GROUPDATA Gdat;
USHORT index, i;
HHND hwndList;
CHAR bufferCGROUPLISTBUFSIZE7;
hwndList = u;nuindowFromID(hund, IDD GROUPS_LIST);
index = SHORT1FROMMR( 4linSendl~lsg(hwndlist, LM_QUERYSELECTION, MPFROMSHORT(LIT_FIRST), 0) );
NinSendMsg(hwndList, LM_OUERYITEMTEXT, MPFROMZSHORT(index) GROUPLISTBUFSIZE), MPFROMP(buffer));
for(i=0; bufferCi)!='\t'; i++); /* Find TAB in buffer */
bufferCi++)=0; /* Terminate at TAB */
strcpy(Gdat.achGroupName, buffer);
strcpy(Gdat.achGroupDescr, buffer+i);
if (index == 0) Gdat.achGroupNameCO) = 0;
if (NinDlgBox(HWND DESKTOP, hwnd, (PFN41P)dpGroupDetail, (HMODULE)NULL, IDD_GRP DETAILS, &Gdat) _-DID_GRPDETA1L_COMMIT) 4linSenchlsg(hwnd, UM-FILLGROUPLIST, 0, 0);
else 4linSer>dwlsg(hwndlist, LM_SELECTITEM, MPFROMSHORT(index), MPFROMSHORT(FALSE));
4linSetFocus(HWND DESKTOP, hwndlist);
return 0;
break;
case IDD GROUPS_DELETE: /*--------------------------------*/
if(WinMessageBox(H41ND DESKTOP, hwnd, "Are you sure "
"you cant to delete marked groups? Press "
"'Yes' to commit this change.", "Commit?", 1, MB_YESNO i MB_ICONEXCLAMATION) _= MBID YES)( USHORT index, i;
HWND hwndList;
CHAR bufferCGROUPLISTBUFSIZE);
hwndlist = WinllindowFromID(hwnd, IDD GROUPS LIST);
index = SHORT1FROMMR( WinSend~lsg(hwndList, LM QUERYSELECTION, MPFROMSHORT(LIT_FIRST), 0) );
while(index != L1T_NONE)( WinSendAsg(hwndList, LM_QUERYITEMTEXT, MPFROM2SHORT(index, GROUPLISTBUFSIZE), MPFROMP(buffer));
for(i=0; bufferCi)!='\t'; i++);
bufferCi++)=0;
dbfcmd(dbproc, " DELETE SSGrpTable"
" WHERE GrpName = \"Xs\"", buffer);
dbsqlexec(dbproc);
while(dbresults(dbproc) != NO_MORE_RESULTS);
index = SHORT1FROMMR( 4)inSend~lsg(hwndList, LM ~UERYSELECTION, MPFROMSHORT(index), 0));

..~ ~' at ~.~ ~; ~. '"~~ a /* while */
uinSen~lsg(hwnd, UM_FILLGROUPLIST, 0, 0);
WinSetFocus(HWND DESKTOP, hwndList);
return 0;
/* i f */
break;
/* switch */
break;
/*__________________________________________________________________*/
/* Multi-Colurtn Listbox stuff */
/*__________________________________________________________________*/
case NM_MEASUREITEM: /*_____________________________________________*/
return (MRFROMLONG(ADSLBMeasure(hwnd, 1DD GROUPS LIST, SHORT1FROMMP(mp2), alCol4lidth, NUMBER_OF COLUMNS, IDD GROUPS LISTHEADER, HEADER TOP, HEADER BOTTOM)));
return(0);
break;
case b1M_DRAWITEM: /*________________________________________________*/
ADSLBDraw(hwnd, IDD_GROUPS_LIST, (PONNERITEM)PVOIDFROMMP(mp2), alColHidth, NUMBER_OF_COLUMNS, IDD GROUPS LISTHEADER, FALSE);
return (MRFROMSHORT(TRUE));
break;
/* switch */
return HinDefDlgProc(hwnd, msg, mpl, mp2);
#undef GROUPLISTBUFSI2E
#undef HEADER_TOP
#undef HEADER_BOTTOM
#undef NUMBER_OF_COLUMNS
/* dpGroup */
/*__________________________________________________________________________*/
/* dpGroupOetail - Group details (jdb) */
/*__________________________________________________________________________*/
MRESULT EXPENTRY dpGroupDetail(HWND hwnd, USHORT msg, MPARAM mpl, MPARAM mp2)C
#define MACHINELISTBUFSIZE 3+1+15+~+g0+~
/*______________________________________________________________________*/
/* Multi-Column Listbox stuff */
/*______________________________________________________________________*/
~idefine HEADER_TOP "Workstation\tWorkstation\tWorkstation"
#define HEADER_BOTTOM "Member\tName\tDescription"
#define NUMBER OF_COLUMNS 3 static ULONG alColWidth(NUMBER OF COLUMNS);
switch(msg)( case l~M_IN1TDLG:( /*________________________________________________*/
PGROUPDATA pGdat;
CHAR achMemberl3+17;
CHAR achMachineName(15+17;
CHAR achMachineDescrl80+17;
CHAR buffer(MACHINELISTBUFSI2E);
HWND hwndList;
alColWidth(07=0;
hwndlist = WirriJindowFromID(hwnd, DID_GRPDETAIL_MACHINELIST);
HinSendAsg(hwndlist, LM_INSERTITEM, MPFROMSHORT(LIT FIRST), MPFROMP("<No Workstations defined>"));
WinEnableHindow(hwndList, FALSE);

WinSendDlgItemMsg(hund, DID_GRPDETAIL_GROUPNAME, EM_SETTEXTLIMIT, MPFROMSHORT(25), 0);
WinSendDlgItemMsg(hund, DID_GRPDETAIL_DESCRIPTION, EM SETTEXTLIMIT, MPFROMSHORT(80), 0);
pGdat = (PGRO<JPDATA)PVOIDFROMMP(mp2);
if(pGdat->achGroupNamel07)( WinSetDlgItemText(hund, DID GRPDETAIL GROIJPNAME, pGdat->achGroupName);
WinEnableWindou(WinWindouFromID(hund, DID_GRPDETAIL_GROUPNAME), FALSE);
WinSetDlgItemText(hund, DID GRPDETAIL DESCRIPTION, pGdat->achGroupDescr);
/* if */
dbfcmd(dbproc, " CREATE TABLE #batchtemp("
" Member char(3),"
" MachineName char(15),"
" MachineDescr char(80)"
" INSERT INTO #batchtemp"
" SELECT"
'No' "
" MachineName,"
" MachineDescr"
" FROM SSMachineTable"
" UPDATE #batchtemp"
" SET"
" a.Member = 'Yes "' " FROM #batchtemp a, SSGrpMachineTable b"
" WHERE a.MachineName = b.MachineName"
" AND b.GrpName = \"%s\""
" SELECT"
" Member "
" MachineName,"
" MachineDescr"
" FROM #batchtemp"
" ORDER BY MachineName"
" DROP TABLE #batchtemp", pGdat->achGroupName);
dbsqlexec(dbproc);
if((dbresults(dbproc) _= SUCCEED) /* create */
&& (~results(dbproc) _= SUCCEED) /* insert */
&8 (~results(dbproc) _= SUCCEED) /* update */
&8 ((dbresults(dbproc)) _= SUCCEED))( /* select */
ACHBIND(l,achMember);
ACHBIND(2,achMachineName);
ACHBIND(3,achMachineDescr);
uhile(dbnextrou(dbproc) != NO_MORE_ROWS)( if(!WinIsWindouEnabled(hundList))( WinEnableWindou(hundList, TRUE);
WinSend~lsg(hundList, LM DELETEALL, 0, 0);
/* i f *%
strcpy(buffer, achMember);
if(bufferC07=='N') strcat(buffer, " ");
strcat(buffer, "\t");
strcat(buffer, achMachineName);
strcat(buffer, "\t");
strcat(buffer, achMachineDescr);

WinSendMsg(hwndList, LM_INSERTITEM, MPFROMSHORT(LIT END), MPFROMP(buffer));
/* while *%
7 /* if */
while(dbresults(dbproc)!= NO MORE RESULTS);
NinEnableNindow(WinWindowFromID(hwnd, DID GRPDETAIL COMMIT), FALSE);
WinSetwindowPtr(hwnd, AWL USER, pGdat); /* Store Buffer address */
if(!WinlsWindowEnabled(WinWindowFromID(hwnd, DID_GRPDETAIL_GROUPNAME)))C
WinSetFocus(HNNO DESKTOP, 11in11indowFromID(hwnd, DID_GRPDETAIL_DESCRIPTION));
return MRFROMSHORT(TRUE);
/* if */
break;
case UM_SETBUTTONSTATES: /*----------------------------------__-_-__*/
if( uin~ueryuindowTextlength( NinWindowFromID( hwnd, DID_GRPDETAIL_GROUPNAME)) && NinOueryWindowTextLength( WinWindowFromlD( hwnd, DID_GRPDETAIL_DESCRIPTION)) )C
NinEnableWindow(WinWindowFromID(hwnd, DID_GRPOETAIL COMMIT), TRUE);
J /* if *%
elseC
uinEnableHindow(41in41indowFromID(hwnd, DID_GRPDETAIL COMMIT), FALSE);
/* else *%
break;
case HM_CONTROL: /*_________________________________________________*/
switch(SHORT1FROMMP(mp1))C
case DID_GRPDETAIL_MACHINELIST: /*--------------------------*/
switch(SHORTZFROMMP(mp1))C
case LN_SELECT:C /*_________________________________*/
CHAR buffer[MACHINELISTBUFSIZE7;
HWND hwndList;
USHORT index;
WinSendAsg(hwnd, UM_SETBUTTONSTATES, 0, 0);
hwndList = 4linWindowFromlD(hwnd, OID_GRPDETAIL_MACHINELIST);
WinEnablellindosAlpdate(hwndList, FALSE);
index = SHORT1FROMMR( WinSendwlsg(hwndList, LM_OUERYSELECT10N, MPFROMSHORT(LIT_FIRST), 0) );
WinSendMsg(hwndList, LM_QUERYITEMTEXT, MPFROM2SHORT(index,MACHINEL1STBUFSIZE), MPFROMP(buffer));
if(buffer[07=='Y') memcpy(buffer, "No ", 3);
else memcpy(buffer, "Yes", 3);
WinSend~tsg(hwndList) LM SETITEMTEXT, MPFROMSHORT(index), MPFROMP(buffer));
WinSer>dlsg(hwndList, LM SELECTITEM) MPFROMSHORT(index), MPFROMSHORT(FALSE));
NinEnablellindowUpdate(hwndList, TRUE);
break;
) /* switch */
break;

case DID_GRPDETAIL_GROUPNAME: /*------------------__---_---*/
case DID_GRPDETAIL_DESCRIPTION: /*-----------------_---------*/
switch(SHORT2FROMMP(mp1))( case EN_CHANGE: /*__________________________________*/
WinSenddsg(hwnd, UM SETBUTTONSTATES, 0, 0);
break;
/* switch */
break;
/* switch */
break;
case LM_COMMAND: /*_________________________________________________*/
switch(SHORT1FROMMP(mp1))( case DID_GRPDETAIL_COMMIT:( /*---------------------------_-__*/
PGROUPDATA pGdat;
CHAR bufferIMACH1NELISTBUFSIZE7;
HWND hwndList;
INT i, iCount, index;
pGdat = Winfluery4lindowPtr(hwnd, ONL_USER);
Ninf~ueryDlgItemText(hwnd, DID GRPDETAIL GROUPNAME, sizeof(pGdat->achGroupName), pGdat->achGroupName);
HinGueryDlgItemText(hwnd, DID_GRPDETAIL DESCRIPTION, sizeof(pGdat->achGroupDescr), pGdat->achGroupDescr);
/*______________________________________________________*/
/* Insert or Update rows in SSGrpTable */
/*______________________________________________________*/
if(WinIsWindowEnabled(WiMlindowFromID(hwnd, DID_GRPDfTAIL GROUPNAME)))C
safe_dbfcmd(dbproc, " INSERT INTO SSGrpTable("
" GrpName,"
" GrpDescr"
n )n " VALUES("
n \u~\n a a \u~\un pGdat->achGroupName, pGdat->achGroupOescr);
/* if */
else( safe_dbfcmd(dbproc, " UPDATE SSGrpTable"
" SET"
" GrpDescr = \"%s\""
" WHERE GrpName = \"9a\"", pGdat->achGroupDescr, pGdat->achGroupName);
/* else '/
dbsqlexec(dbproc);
while(dbresults(dbproc) != NO MORE RESULTS);
/*______________________________________________________*/
/* Make coresponding changes to SSGrpMachineTable */
/*______________________________________________________*/
hwndList = 4liMlindowFranID(hwnd, DID_GRPDETAIL MACHINELIST);
iCount = SHORT1FROMMR(WinSend~lsg(hwndList, LM_QUERYITEMCOUNT, 0, 0));
for(index=0; index<iCount; index++)~
WinSenc>rlsg(hwndList, LM_OUERYITEMTEXT, MPFROM2SHORT(index, MACHINELISTBUFSIZE), MPFROMP(buffer));
for(i=4; bufferli)!='\t'; i++);

,~ sa ~ y'°1 f a ~ ~ ~_ :a .r .'~ Ls bufferli7=0;
if(bufferC07=='Y')( dbfcmd(dbproc, " INSERT INTO SSGrpMachineTable"
" (GrpName, MachineName)"
" VALUES(\"%s\", \"%s\")", pGdat->achGroupName, buffer+4);
/* if */
else( dbfcmd(dbproc, " DELETE SSGrpMachineTable"
" NHERE GrpName = \"%s\""
" AND MachineName = \"%s\"", pGdat->achGroupName, buffer+4);
J /* else */
dbsqlexec(dbproc);
while(dbresults(dbproc) != NO MORE RESULTS);
/* for *~
break;
/* snitch */
break;
/*__________________________________________________________________*/
/* Multi-Colurtn Listbox stuff */
/*__________________________________________________________________*/
case WM MEASUREITEM:( /*-___________________________________________*/
MRESULT mr;
alColWidth(07=0;
mr = MRFROMLONG(ADSLBMeasure(hwnd, DID_GRPDETAIL_MACHINELIST, SHORT1FROMMP(mp2), alColNidth, NUMBER_OF_COLUMNS, DID_GRPDETAIL_MACHINELISTHEADER, HEADER TOP, HEADER BOTTOM));
return(mr);
break;
case h1M_DRANITEM: /*________________________________________________*/
ADSLBDraw(hwnd, DID_GRPDETAIL_MACHINELIST, (POWNERITEM)PVOIDFROMMP(mp2), alColWidth, NUMBER OF COLUMNS, DID GRPDETAIL MACHINELISTHEADER, FALSE);
return (MRFROMSHORT(TRUE));
break;
/* snitch */
return 4linDefDlgProc(hund, msg, mpl, mp2>;
#undef MACNINEL1STBUFSIZE
#undef HEADER TOP
#undef HEADER_80TTOM
#undef NUMBER_OF_COLUMNS
/* dpGroupDetail */
/*****,t,r*****tr**************************************************************
**/
/* */
/* ZoomDlgProc */
/* */
/* This dlgproc creates a window that provides additional information about */
/* any job existing in SSPendingJobTable. Rescheduling information is shown */
/* as is the current status of the Job and of the Batch Scheduler. A timer */
/* is used to dynamically update this display to reflect changes in job and */
/* scheduler status. */
/***********************************x*********x***********x*******************/

MRESULT EXPENTRY ZoomDlgProc(H41ND hand, USHORT msg, MPARAM mpl, MPARAM mp2) C

~.~ ~~~~~r~

DBCHAR JobRunIDCJOBIDLENGTH7;

DBCHAR JobListNameLJOBNAMELENGTH7;

DBCHAR UserRqst;

DBCHAR CurrentStat;

DBCHAR StepNumCSTEPNUMLENGTH7;

DBCHAR StepResultCSTEPNUMLENGTH7;

DBCHAR GrpNameCGROUPNAMELENGTH7;

DBCHAR MachineNameIMACHINENAMELENGTH7;

DBCHAR StartTimeCJOBDATELENGTH7;

DBCHAR EndTimeCJOBDATELENGTH7;

DBCHAR NextRunDateCJOBDATELENGTH7;

DBCHAR RecurLleekdayCRECURLENGTH7;

DBCHAR RecurMonthdayCRECURLENGTH7;

DBCHAR RecurMonthCRECURLENGTH7;

DBINT RecurPrd;

DBCHAR SchedByCJOBEDITBYLENGTH7;

DBCHAR PriorityFlag;

CHAR bufferC807;

USHORT i;

USHORT usNum;

CHAR szText1C607;

CHAR szText2C607;

staticUSHORTusTimer;

staticULONG ulJobId;

staticHPOINTERhpointerUserReq;

staticHPOINTERhpointerStatus;

switch (msg) case 4fM COMMAND: /*_____________________________________________________*/
switch (COMMANDMSG(8msg)->cmd) case DID CANCEL: /*_______________________________________________*/
break;
/* SwltCh */
break;
/*
* On the way out, disable updates to the icon status fields, then * restore the original icon to these fields. This prevents PM from * deleting the pointer handles that we may need later on.
*/
case IIM_DESTROY: /*_____________________________________________________*/
WinStopTimer(hab, hwndClient, usTimer);
WinShorAlindow(HinWirxiowFromID(hwnd, DID_ZOOM USERREO), FALSE);
WinShowWindow(WinWindowFromID(hwnd, DID ZOOM_STATUS), FALSE);
WinSer>dDlgItemMsg(hwnd) DID_ZOOM_USERREQ, SM_SETHANDLE, (MPARAM) hpointerUserReq, (MPARAM) OL);
WinSerxblgItemMsg(hwnd, DID_ZOOM_STATUS, SM_SETHANDLE, (MPARAM) hpointerStatus, (MPARAM) OL);
HinDismissDlg(hund, TRUE);
break;
/*
* Save the original pointer handles for our exit, save the incoming * JobRunld in the Windowblord, start the refresh timer and send a timer * message for quick initial paint.
*/
case 6M INITDLG: /*_____________________________________________________*/
hpointerUserReq = (HPOINTER) 4tinSencJDlgItemMsg(hwnd, DIO_ZOOM_USERREO, SM_OUERYHANDLE, (MPARAM)OL, (MPARAM) OL);
hpointerStatus = (HPOINTER) HinSer>dDtgItemMsg(hwnd, DID_ZOOM_STATUS, SM_~UERYHANDLE, (MPARAM)OL, (MPARAM) OL);
WinSetWindowULong(hwnd, ~WL_USER, SHORT1FROMMP( mp2 ));
usTimer = HinStartTimer(hab, hwnd, T10_ZOOM_REFRESH, ZOOMREFRESH);
WinSendAsg(hwnd, hM_TIMER, MPFROMSHORT(T10 ZOOM REFRESH), OL);

a y ~ °~~ ~ ~, ~J ..b. i:- ~ ~.. ~~ J
' 7 0 -return(0);
/*
* Tick Tock. On each timer message query the latest and greatest * info about this job.
*/
case NM_TIMER: /*______________________________________________________*/
if (SHORT1FROMMP(mp1) _= TID ZOOM_REFRESN) * Change the pointer because this could take awhile.
*/
WinSetPointer(HWND DESKTOP, uinauerySysPointer(HwND DESKTOP, SPTR WAIT, FALSE));
/* Get the Jobld from the window~lord */
ulJobld = NinOueryWindouUlong(hwnd, ~L1L USER);
/* Build and execute the SQL command buffer... */
safe_dbfcmd(dbproc, " SELECT"
" JobRunID,"
JobListName,"
" UserRqst,"
" CurrentStat,"
" StepNun,"
" StepResult,"
" GrpName,"
" MachineName,"
" PriorityFlag,"
" convert(char(30), StartDateTime, 0),"
" convert(char(30), Er>dDateTime, 0),"
" convert(char(30), NxtRunDateTime, 0),"
" Recurueekday,"
" RecurMonthday,"
" RecurMonth,"
" RecurPrd,"
" SchedBy"
" FROM SSPendingJobTable"
" WHERE JobRunID = %ld", ulJobId);
dbsqlexec(dbproc);
dbresults(dbproc);
dbbind(dbproc, 1, NTBSTRINGBIND, (LONG)sizeof(JobRunID), JobRunID);
dbbind(dbproc, 2, NTBSTRINGBIND, (LONG)sizeof(JobListName), JobListName);
dbbind(dbproc, 3, CHARBIND, (DBINT) 1, 8dJserRqst);
dbbind(dbproc, 4, CHARBIND, (DBINT) 1, &CurrentStat);
dbbind(dbproc, 5, NTBSTRINGBIND, (LONG)sizeof(StepNum), StepNum);
dbbind(dbproc, 6, NTBSTRINGBIND, (LONG)sizeof(StepResult), StepResult);
dbbind(dbproc, 7, NTBSTRINGBIND, (LONG)sizeof(GrpName), GrpName);
dbbind(dbproc, 8, NTBSTRINGBIND, (LONG)sizeof(MachineName), MachineName);
dbbind(dbproc, 9, CHARBIND, (DBINT) 1, (BYTE *) BPriorityFlag);
dbbind(dbproc, 10, NTBSTRINGBIND, (LONG)sizeof(StartTime), StartTime);
dbbind(dbproc, 11, NTBSTRINGBIND, (LONG)sizeof(EndTime), EndTime);
dbbind(dbproc, 12, NTBSTRINGBIND, (LONG)sizeof(NextRuroate), NextRunDate);
dbbind(dbproc, 13, NTBSTR1NGBIND, (LONG)sizeof(RecurWeekday), Recurlleekday);
dbbind(dbproc, 14, NTBSTRINGBIND, (LONG)sizeof(RecurMonthday), RecurMonthday);
dbbind(dbproc, 15, NTBSTRINGBIND, (LONG)sizeof(RecurMonth), RecurMonth);
dbbind(dbproc, 16, INTBIND, 4, (BYTE *) BRecurPrd);
dbbind(dbproc, 17, NTBSTRINGBIND, (LONG)sizeof(SchedBy), SchedBy);

A
-m-if (dbnextrow(dbproc) != NO MORE R04fS) C
/* Build the window title and set */
NinLoadString(hab, (HMODULE)NULL) IDS_JOB-ID, sizeof(szTextl), szTextl);
NinLoadString(hab, (HMODULE)NULL, IDS JOB NAME, sizeof(szText2), szText2);
sprintf(buffer, "%s: %s - %s: %s", szTextl, JobRunlD, szText2, JobListName);
4linSetWindowText(hwnd, buffer);
/* Set the UserRqst icon based on the UserRqst field */
WinShowWindow(NinNindowFromID(hwnd, DID ZOOM USERREG), FALSE);
switch (UserRqst) C
/* Job is on Hold */
case ~H~~ /*__________________________________________________*/
HinSendDlgItemMsg(hwnd, DID ZOOM_USERREO, SM SETHANDLE, (MPARAM) hpointerArray[IDI STOPLIGHT - IDI BITBASEI, (MPARAM) OL);
WinShowWindow(llinWindowFromID(hwnd, DID ZOOM USERREG), TRUE);
break;
/* Job will execute one Step only */
case ~S'~ /*__________________________________________________*/
WinSer>dDlglteirl~lsg(hwnd, DID ZOOM_USERREG, SM_SETHANDLE, (MPARAM) hpointerArray[IDI STEPS - IDI BITBASE7, (MPARAM) OL);
WinShouNindow(WinWindowFromID(hwnd, D1D ZOOM USERREQ), TRUE);
break;
/* Job has been Cancel by user */
case 'C~~ /*__________________________________________________*/
4linSendDlgItemMsg(hwnd, DID ZOOM_USERREO, SM_SETHANDLE, (MPARAM) hpointerArray[1DI ERASER - IDI B1TBASE7, (MPARAM) OL);
WinShowNindow(WinWindowFromID(hwnd, DID ZOOM USERREO), TRUE);
break;
/* switch */
/* Set the job Current Status indicator icon */
WinShowWindow(WirrilindowFromlD(hwnd, DID ZOOM-STATUS), FALSE);
switch (CurrentStat) /* Danger Will Robinson - job errored out*/
case ~E~~ /*__________________________________________________*/
WinSerxDlgItemMsg(hwnd, DID_ZOOM_STATUS, SM SETHANDLE, (MPARAM) hpointerArray[IDI 41ARN1 -- IDI BITBASE7, (MPARAM) OL);
4linShowHindow(NinWindowFromID(hwnd, DID ZOOM-STATUS), TRUE);
break;
/* Group is busy */
case 'G'~ /*-_________________________________________________*/
WinSendDlgItemMsg(hwnd) DID ZOOM_STATUS, SM_SETHANDLE, (MPARAM) hpointerArray[IDI GRPBUS'l IDI BITBASE7, (MPARAM) OL);
4linShowWindow(WiMlindowFromID(hwnd, DID ZOOM_STATUS), TRUE);
break;
/* Job is running */
~. /*__________________________________________________*/
case R .
WinSerxDlgIteMASg(hwnd, DID_ZOOM_STATUS, SM_SETHANDLE, (MPARAM) hpointerArray[IDI RUN - IDI BITBASE7) (MPARAM) OL);
llinShowllindow(WinWindowFromID(hwnd, DID ZOOM STATUS), TRUE);
break;

~e~~~.~~' /* SUCCESSFUL completion */
r r. /*__________________________________________________*/
case S .
4linSendDlgItemMsg(hwnd, DID_200M_STATUS, SM SETHANDLE, (MPARAM) hpointerArrayIIDI-FIN1SH -- IDI BITBASE7, (MPARAM) OL);
WinShowuindow(uinNindowFromID(hwnd, D1D ZOOM-STATUS), TRUE);
break;
/*
* Job is attempting to run on a workstation - probably awaiting * user verification.
*/
case 'T'~ /*-_________________________________________________*/
WinSendDlgItemMsg(hwnd, D1D_ZOOM_STATUS, SM_SETHANDLE, (MPARAM) hpointerArrayfIDI VERIFY IDI BITBASE7) (MPARAM) OL);
4linShow4lindow(WinWindowFromID(hwnd, DID ZDOM_STATUS), TRUE);
break;
/*
* Job is scheduled and is awaiting execution.
*/
case '41'~ /*-_________________________________________________*/
WinSerxblgItemMsg(hwnd, DID_ZOOM_STATUS, SM_SETHANDLE, (MPARAM) hpointerArrayllDl SCHED1 - IDI BITBASE7, (MPARAM) OL);
4linShouHindow(WinWindowFramID(hwnd, DID ZOOM STATUS), TRUE);
break;
/* switch */
/* Set the text fields...*/
WinSetDlgItemText(hwnd, DID_ZOOM_STEPNUM, StepNum);
WinSetDlgItemText(hwnd, DID_ZOOM_STEPRESULT) StepResult);
WinSetDlgItemText(hwnd, DID_ZOOM_GRPNAME, GrpName);
WinSetDlgItemText(hwnd, DID_ZOOM_MACHINENAME, MachineName);
NinSetDlgItemText(hwnd, DID_ZOOM_STARTTIME, StartTime);
WinSetDlgItemText(hwnd) DID_ZOOM_ENDTIME, EndTime);
if ((SHORT)PriorityFlag =_ 't' ) 4linLoadString(hab, (HMODULE)NULL, IDS RUSH, sizeof(NextRunDate>, NextRunDate);
else if ((SHORT)PriorityFlag =_ '2') WinLoadString(hab, (HMODULE)NULL, IDS_ASAP, sizeof(NextRuroate), NextRunDate);
NinSetDlgItemText(hwnd, DID ZOOM-NEXTRUN, NextRunDate);
/* Loop through the days to disable/enable text as needed. */
usNum = atoi(RecurWeekday);
for ( i = 0; i < 7; i++) C
HinEnableWindow( WinWindowFromID(hwnd, DID_ZOOM_SUN + i), usNun 8 ((USHORT) 1 « i));
/* for */
if(atoi(RecurMonthday)==255) NinSetDlgItemText(hwnd, DID ZOOM MONTHDAY, "Last");
else 4linSetDlgltemText(hwnd, DID ZOOM MONTHDAY, RecurMonthday);
/* Loop through the months to disable text as needed. */
usNum = atoi(RecurMonth);
for ( i = 0; i < 12; i++) C
HinEnableWindow( NinNindowFromID(hwnd, DID_ZOOM_JAN + i), usNum 8 ((USHORT) 1 « i));
/* for */
for (i = 0; i < 13; i++) WinEnableHindow( WinWindowFromID(hwnd, D1D ZOOM_1 + i), (USHORT)RecurPrd & ((USHORT) 1 « i));
/* for */
if(RecurPrd) WinSetDlgltemText(hwnd, DID ZOOM_PMOFFSET, "Day of the Period:");
WinSetDlgItemText(hwnd, DID ZOOM_SCHEDBY, SchedBy);
/* if *%
dbcanquery(dbproc);
while (dbresults(dbproc) != NO MORE RESULTS) dbcanquery(dbproc);
/* if */
/*
* Restore the pointer to the default.
*/
WinSetPointer(HWND DESKTOP, Wir>DuerySysPointer(HWND DESKTOP, SPTR ARROW, FALSE));
return(0);
/* switch */
return WinDefDlgProc(hwnd, msg, mpl, mp2);
/* ZoomDlgProc */
/*****************************************************************x***********/

/* */
/* FilterDlgProc */
/* */
/* A view filter allows the user to define and view subsets of the jobs that */
/* live in the SSPendingJobtable. These Filters are GLOBAL and are used */
/* to build the 'where' clause in the LoadListBox routine when items are */
/* selected for display in the top level listbox. */
/*****************x***********************************************************/

MRESULT EXPENTRY FilterDlgProc(HWND hwnd, USHORT msg, MPARAM mpl, MPARAM mp2) C
HWND hwndhlenu;
USHORT usCount;
DBCHAR ConvertDateIJOBDATELENGTH);
switch (msg) C
case WM_COMMAND: /*____-_-______________________________________________*/
switch (COMMANDMSG(&msg)->cmd) C
case DID_CANCEL: /*_________________________-_____________________*/
WinDismissDlg(hwnd, TRUE);
return(0);
/*
* The following CLEAR buttons erase the contents of the related * entry field.
*/
case OID_FILTER_JOBCLEAR: /*--------------------------------------*/
WinSetWindowText( WirrilindowFromID(hwnd, DID FILTER JOBCOMBO), "");
strcpy(pszFilterJob, "");
return(MRFROMSHORT(1));
case DID_FILTER_BYCLEAR: /*---------------------------------------*/
WinSetWindowText(WinWindowFramID(hwnd, DID_FILTER BYCOMBO), "");
strcpy(pszFilterJob, "");
return(MRFROMSHORT(1));
case DID_FILTER_GROUPCLEAR: /*------------------------------------*/
WinSet4lindowText(Win4lindowFromID(hwnd) DID-FILTER GROUPCOMBO), "");
strcpy(pszFilterJob, "");
return(MRFROMSHORT(1));
/*
* Save the new filters.
*/

case DID OK: /*___________________________________________________*/
/*
* Keep a filter count (crude). If a filter exists we will * set the Filter menu item checkmark.
*/
usCount = NinCueryDlgItemText(hwnd, DID FILTER_JOBCOMBO, JOBNAMELENGTH, pszFilterJob);
usCount += Win~ueryDlgItemText(hwnd, DID_FILTER_BYCOMBO, JOBEDITBYLENGTH, pszFilterBy);
usCount += Win~ueryDlgItemText(hwnd, DID_FILTER_GROUPCOMBO, GROUPNAMELENGTH, pszFilterGroup);
usCount += 4lir>DueryDlgItemText(hwnd, DID_FILTER START, DATELENGTH, ConvertDate);
ADSConvertDateToMDY(pUserAttr->szDateFmtCode, ConvertDate, pszFilterStart);
usCount += WinGueryDlgItemText(hwnd, DID_FILTER END, DATELENGTH, ConvertDate);
ADSConvertDateToMDY(pUserAttr->szDateFmtCode, ConvertDate, pszFilterEnd);
/* Set the Filter menu item checkmark */
hwnc~lenu = WiMdindowFromID(41in0ueryblindow(hwndCLient, ~W PARENT, FALSE), FID MENU);
WinSerxllsg(hwnd~lenu, MM_SETITEMATTR, MPFROM2SHORT(IDM FILTER, TRUE), MPFROMZSHORT(MIA CHECKED, usCount ? MIA CHECKED : 0));
WinDismissDtg(hwnd, TRUE);
WinSerx~lsg(hwnd, SIM-TIMER, MPFROMSHORT(TID CLIENT REFRESH), OL);
/* switch *~
break;
case L~M_INITDLG: /*_____________________________________________________*/
/* Load all available job names in the first combo box */
LoadListBox(hwnd, DID_FILTER-JOBCOMBO, (PSZ) NULL, (PSZ)NULL, 0);
NinSetWindowText(WinWindowFromID(hwnd, DID-FILTER-JOBCOM80), pszFilterJob);
/* Load all available job author names into the second list */
LoadListBox(hwnd, DID FILTER_BYCOMBO, (PSZ) NULL, (PSZ)NULL, 0);
WinSetWindowText(WinWindowFromID(hwnd, DID-FILTER BYCOMBO), pszFilter8y);
/* load all of the available groups ino the third */
LoadListBox(hwnd, DID FILTER_GROUPCOM80, (PSZ) NULL, (PSZ)NULL, 0);
NinSetNindowText(WinWindowFromID(hwnd, DID-FILTER GROUPCOM80), pszFilterGroup);
ADSSetFormat(hwnd, DID_FILTER START, pUserAttr->szDateFmtCode);
ADSSetFormat(hwnd, DID-FILTER END, pUserAttr->szDateFmtCode);
/* Set text limits on the date entry fields */
WinSendolgItemMsg(hwnd, DID_F1LTER_START, EM SETTEXTLIMIT, MPFROMSHORT(JOBDATELENGTH -- 1), OL);
ADSConvertDateFrortMOY(pUserAttr->szDateFmtCode, ConvertDate, pszFilterStart);
NinSet4lindowText(WirrilindowFromID(hwnd) DID_FILTER_START), ConvertDate);
WinSerxDlgItemMsg(hwnd, DID_FILTER_END, EM_SETTEXTL1MIT, MPFROMSHORT(JOBDATELENGTH - 1), OL);
ADSConvertDateFromMDY(pUserAttr->szDateFmtCode, ConvertDate, pszFilterEnd);
WinSetHindowText(WinHindowFromID(hwnd, DID-FILTER END), ConvertDate);
return(0);
/* switch */

t -a _w ~:.r g _.~
_75_ return WinDefDlgProc(hund, msg, mpl, mp2);
J /* FilterDlgProc */
/*************************x******************************x********************/

/* */
/* PickServerDlgProc */
/* */
/* This dlgproc allows the batch administrator to start the Batch Schedule */
/* Server on one of the registered machines. */
/* */
/**************************************************x**************************/

MRESULT EXPENTRY PickServerDlgProc(HUND hwnd, USHORT msg, MPARAM mpl, MPARAM mp2)C
USHORT i;
USHORT usResult;
CHAR szText1L807;
CHAR szText2[807;
static CHAR szHeadingTop(807;
static CHAR szHeading8ottomf807;
static LONG alColuidthIPICKSERV COIUMNS7;
snitch (msg) case WM_INITDLG: /*-___________________________________________________*/
/*
* Change the pointer to the hour glass */
WinSetPointe~(HNND_DESKTOP, WinGuerySysPointer(H41ND DESKTOP, SPTR WAIT, FALSE));
/*
* Load the colum title strings from the resource.
*/
4linloadString(hab, (HMODULE)NULL, IDS_PICKSERV_LIST1_TOP, sizeof(szHeadingTop), (PSZ)szHeadingTop);
4linLoadString(hab, (HMODULE)NULL, IDS_PICKSERV_LIST1_BOT, sizeof(szHeadingBottom), (PSZ)szHeading8ottom);
/* Set colurtn widths to zero */
for (i = 0; i < PICKSERV_COLUMNS; i++) alCol4lidthli7 = 0;
/* Load the listbox with the machine list */
LoadListBox(hwnd, DID PICKSERV ADSLIST, (PSZ)NULL, (PSZ)NULL, 0);
/* Restore the pointer to the default */
WinSetPointer(HWND_DESKTOP, Wir>QuerySysPointer(HWND DESKTOP, SPTR ARROW, FALSE));
return(0);
case bM_CONTROL: /*____________________________________________________*/
switch (SHORT2FROMMP(mp1)) /*
* If the user has double clicked on an item try to start server */
case LN_ENTER: /*________________________________________________*/
llinSetPointer(H41ND_DESKTOP, Wir>DuerySysPointer(HNND_DESKTOP, SPTR_WAIT) TRUE));
if (GetSelectedItemString(hwnd, DID_PICKSERV_ADSLIST, szServerName, MACHINENAMELENGTH, TRUE) >= 0) C
if (ADSNetExec(szServerName, BATCHD_SERVICE, NULL, pUserAttr->szDefaultServer, &usResult, FALSE) _-EXEC_NOTFOUND) WinLoadString(hab, (HMODULE)NULL, IDS MACHINE UNAVAIL, sizeof(szTextl), (PSZ)szTextl);

r. .~ ~~ _ .~a NinLoadString(hab, (HMODULE)NULL, IDS ERROR, sizeof(szText2), (PSZ)szText2);
WinMessageBox(HWND DESKTOP, HNND DESKTOP, szTextl, szText2, (USHORT) NULL, MB_OK i MB ERROR ~ MB MOVEABLE);
return(0);
J /* i f */
HinDismissOlg(hwnd, TRUE);
return(0);
/* i f */
return(0);
/* switch */
break;
/*
* Multicolum Listbox required stuff...
*/
case 61M MEASUREITEM: /*________________________________________________*/
switch (SHORT1FROMMP(mp1)) case DID_PICKSERV_ADSLIST: /*------------------------------------*/
return (MRFROMLONG(ADSLBMeasure(hwnd, DID_PICKSERV_ADSLIST, SHORT1FROMMP(mp2), alColHidth, PICKSERV COLUMNS, DID_PICKSERV_HEADING, szHeadingTop, szHeadingeottom)));
/* switch */

return(0);

case NM_DRAUITEM: /*_____________________________________-__-__________*/

switch (SHORT1FROMMP(mpt)) C

case DID_PICKSERV_ADSLIST: /*------------------------------------*/

ADSLBDraw(hwnd, DID_PICKSERV_ADSLIST, (PONNERITEM)PVOIDFROMMP(mp2), alColHidth, PICKSERV_COLUMNS, D1D PICKSERV HEADING, FALSE);

return (MRFROMSHORT(TRUE));

/* switch */

return(0);

case bM_COMMAND: /*____________________________________________________*/

switch (COMMANDMSG(8dr~sg)->cmd) C

case DID_OK: /*_________________________________-_____-__________*/

NinSetPointer(HWND_DESKTOP, HinOuerySysPointer(HWND DESKTOP, SPTR_WAIT, TRUE));

if (GetSelectedltemString(hwnd, DID_PICKSERV_ADSLIST, szServerName, MACHINENAMELENGTH, TRUE) >=
0) if(ADSNetExec(szServerName, BATCND_SERVICE, NULL, pUserAttr->szDefaultServer, &usResult, FALSE) --EXEC NOTFOUND)( HinLoadString(hab, (HMODULE)NULL) IDS MACHINE
UNAVAiL, sizeof(szTextl), (PSZ)szTextl);

WinLoadString(hab, (HMODULE)NULL, IDS ERROR, sizeof(szText2), (PSZ)szText2);

WiMIessage8ox(HWND DESKTOP, HHND DESKTOP, szTextl, szText2, (USHORT) NULL) MB_OK ~ M8 ERROR ; MB MOVEABLE);

return(0);

) /* if */

WinDismissDlg(hwnd, TRUE);

return(D);

case DID_CANCEL: /*_______-_-____________________________________*/

NinDismissDlg(hwnd, FALSE);

return(0);

/* switch */
break;
/* switch */

~~~1 ~~9 ~,a ..~. e~ _ .~ ~s _77_ return WinDefDlgProc(hwnd, msg, mp1, mp2);
J /* PickServerDlgProc */
/*********x****************************x*x************************************/

/* NewTitleBarProc */
/* */
/* This procedure either replaces or suppliments the standard paint routine */
/* for the titlebar. If the user does not have admin perms edges ar the */
/* batch scheduler is not up, a bitmap representing the scheduler is */
/* displayed on the right edge of the standard titlebar. */
/* */
/* If the user has admin priviledges and the server is running, the entire */
/* titlebar is painted here. The server name is placed on the right edge */
/* of the titlebar and the actual title text is centered in the remaining */
/* rectangle. */
/* */
/* The color of the titlebar bitmap or server name indicates the following: */
/* */
/* GREEN: Server is running and is accepting jobs. */
/* YELLOW: Server is running but will not start a new job. */
/* RED: Server is not running. */
/* */
/*****x********************xxxxx******x***************xx**********************/

MRESULT EXPENTRY NewTitleBarProc( HWND hwnd, USHORT msg) MPARAM mp1, MPARAM mp2)~
HPS hps;
HPS hpsMemory;
NDC hdcMemory;
RECTL rectl;
RECTL rectlFill;
RECTL rectlText;
BITMAPINFOHEADER Bitlnfo;
LONG lcyTitleBar;
LONG IRGBback;
SI2EL sizl ;
POINTL aptl[4] ;
USHORT usRedDitf;
USHORT usGreenDiff;
USHORT usBlueDiff;
POINTL ptlLeft;
PO1NTL ptlRight;
MRESULT mresult;
switch (msg) case TBM_SETHILITE: /*________________________________________________*/
WinEnableWindowUpdate(hwnd, FALSE);
mresult = OldTitleearProc(hwnd) msg, mpl, mp2);
WinEnableWindowUpdate(hwnd, TRUE);
return(mresult);
case hM_PAINT: /*_____________________________________________________*/
/*
* If the application does not have focus, do not paint the server * status because the timer will not be running. Simply call the * default window proc for the titlebar and return a zero.
*/
it (!(DldTitleBarProc(hwnd, TBM OUERYNILITE, OL, OL))) OldTitleBarProc(hwnd, msg, mpl, mp2);
/*
* Else if the user is not an admin or the server is not up, * will will display a bitmap on the default titlebar.
*/
else if (!GBLbAdmin ;; GBLStatusColor == Ox00FF0000) C

~~~ ~~ ~'~ ~_ ~ f~
_78_ /* Open memory DC and create PS associated with it. */
hdcMemory = DevOpenDC (hab, OD MEMORY, ~~*~~, OL, NULL, NULL) ;
sizl.cx = 0 ;
sizl.cy = 0 ;
hpsMemory = GpiCreatePS (hab, hdcMemory, 8sizl, PU_PELS ; GPIF_DEFAULT ;
GPIT M1CR0 ; GPIA ASSOC) ;
GpiSeteitmap (hpsMemory, hbmStatus) ;
/* Call the original proc to allow the title bar to paint. */
OldTitleBarProc(hwnd, msg, mpl, mp2);
/* Get the titlebar rectangle. */
WinOueryWindowRect(hwnd, &rectl>;
hps = uinGetPS(hwnd);
/* Get the height of the titlebar */
lcyTitleBar = WinOuerySysValue(HNND DESKTOP, SV CYTITLEBAR);
/*
* Set the color table to RGB mode so that we can paint dithered * colors on the titlebar.
*/
GpiCreateLogColorTable(hps, LCOL RESET, LCOLF_RGB, OL, OL, (PLONG) NULL);
/* Get the RGB value of the titlebar color */
IRGBback = IlinOuerySysColor(H41ND DESKTOP, SYSCLR ACTIVETITLE, OL);
/*
* Calculate the target and source bitmap coordinates.
*/
aptll07.x = rectl.xRight - lcyTitleear + 1;
aptlL07.y = 1 ;
aptlll7.x = aptlL07.x + lcyTitleBar - 1;
aptlll7.y = aptlL07.y + lcyTitleBar - 1;
aptlL27.x = 0 ;
aptll27.y = 0 ;
GpiCueryBitmapParameters(hbmStatus, &BitInfo);
aptlL37.x = BitInfo.cx;
aptlf37.y = BitInfo.cy;
GpiSetBackColor(hps, OL);
/*
* Calculate the difference between the color components of the * tittebar and the current StatusColor. If the sum of these * differences is too small the icon may be too difficult to see.
*/
usRedDiff = abs((SHORT)(((IRGBback 8 Ox00FF0000L) » 16) -((GeLStatusColor & Ox00FF0000L) » 16)));
usGreenDiff = abs((SHORT)(((lRGeback & Ox0000FF001) » 8) -((GBLStatusColor & Ox0000FF00L) » 8)));
usBLueDiff = abs((SHORT)((IRGBback 8 Ox000000FFL) -(GBLStatusColor & Ox000000FF1)));
/*
* The titlebar color may hide the icon so we wilt display a * black background around it.
*/
GpiSetColor(hps, GBLStatusColor);
GpiBitBlt (hps) hpsMemory, 4L, aptl, Ox00CCL, 880 AHD) ;

~ '~ ~$
~ _,_ .y 2 _79_ NinReleasePS(hps);
GpiDestroyPS (hpsMemory) ;
DevCloseDC (hdcMemory) ;
/* else-if */
/*
* Else the user is an Admin, so we wilt display the server name * on the titlebar.
*/
else C
/* Get the titlebar rectangle. */
WinOueryWindowRect(hwnd, 8rectl);
ptlleft.x = rectl.xleft;
ptlLeft.y = rectl.yBottom;
ptlRight.x = rectl.xRight;
ptlRight.y = rectl.yBottom;
OldTitleBarProc(hwnd, msg, mpl, mp2);
hps = WinGetPS(hwnd);
/* Set the color table to the RGB mode */
GpiCreateLogColorTable(hps, LCOL RESET, LCOLF_RGB, OL, OL, (PLONG) NULL);
rectl.yBottomt+;
WinCopyRect(hab, 8rectlText, 8rectl);
WinCopyRect(hab, 8rectlFill, 8rectl);
/*
* Duery the rectangle needed for the server name. The WinDrawText * API is used to right justify the text.
*/
WinDrawText(hps, -1, szServerHame, 8rectlText, OL, OL, DT OUERYEXTENT ; DT VCENTER i DT RIGHT);
/*
* Move this rectangle to the left a couple of pals for appearance.
*/
WinOffsetRect(hab, 8rectlText, -5, 0);
/*
* Draw the text, allowing WinDrawText to fill the background * around the characters.
*/
rectlFill.xLeft = rectlText.xLeft - 5;
uinFillRect(hps, 8rectlFill, CLR BLACK);
GpiSetBackMix(hps, BM_OVERPAINT);
WinDrawText(hps, -1, szServerName, 8rectlText, GBLStatusColor, OL, DT LEFT);
WinReleasePS(hps);
return 0;
/* else */
return(0);
default: /*___________________________________________________________*/
return(OldTitleBarProc(hwnd, msg, mpl, mp2));
/* switch */
/* NewTitleBarProc */
/*******************************************x************xx*x*****************/

/* SetStatusColor */
/* */
/* This routine checks the schedule server status and sets the global color */

~3 y1 -_ ~' ' 7 ria .:t ~..s ~ -_"4 "~~ d /* flag . */
/*****************************************************************************/

VOID SetStatusColor(VOID)( ULONG ulNetConnect;
USHORT usRequest;
USHORT usBytes;
RECTL recd;
safe_dbfcmd(dbproc, " SELECT ComputerName"
" FROM SSRegisteredSvc "
" WHERE SVCNertle = \"°/aS\"", BATCHD SERVICE);
dbsqlexec(dbproc);
dbresults(dbproc);
dbbind(dbproc, 1, NTBSTRINGBIND, sizeof(szServerName), szServerName);
szServerName(07=0;
/* If the scheduler is not registered, set status icon color to RED */
if (dbnextrow(dbproc) _= NO_MORE R041S) GBLStatusColor = Ox00FF0000L; /* OORRGGBB */
) /* if */
else while (dbnextrow(dbproc) != NO MORE ROWS) ;
/* If the scheduler is not available, set status icon color to RED */
if (ADSNetConnect(&ulNetConnect, szServerName) BATCHD SERVICE)) GBLStatusColor = Ox00FF0000L; /* OORRGGBB *%
safe_dbfcmd(dbproc, " DELETE fran SSRegisteredSvc "
" WHERE SVCName = \"XS\"", BATCHD SERVICE);
dbsqlexec(dbproc);
dbcanquery(dbproc);
while (dbresults(dbproc) != NO MORE RESULTS) dbcanquery(dbproc>;
/* if */
else C
/* Is the scheduler accepting new jobs ? */
usRequest = BATCHD_OUERY_NEWJOBS;
ADSNetWrite(ulNetConnect, BusRequest, sizeof(usRequest));
ADSNetRead(ulNetConnect, BusRequest, sizeof(usRequest), &usBytes);
/* ...no: status icon to YELLOW. */
if (usRequest) GBLStatusColor = Ox00FFFF00l; /* OORRGGBB */
else GBLStatusColor = Ox0000FF00L; /* OORRGGBB */
ADSNetDisconnect(ulNetConnect);
/* else */
/* else */
/*
* Need to force the icon to repaint. This is done by invalidating * a tiny area of the titlebar underneath the icon to minimize * the amount of titlebar repainting and icon flash.
*/
uir~ueryWindowRect(WinHindowFranID(hwndFrame, FID TITLEBAR), 8rectl);
if (!GBLbAdmin) C
rectl.xLeft = rectl.xRight - 1;
rectl.y8ottom = rectl.yTop - 1;
/* if */
NinlnvalidateRect(WinHindowFromID(hwndFrame, FID TITLEBAR), &rectl, TRUE);

ra _tL ~~ ~ w'~_ ~ d /* SetStatusColor */
/************************************************************************
* Function: SetActive0ptions * Description:
* Returns: nothing **********************xx************************************************/
VOID SetActive0ptions(H41ND hwnd) C
HNND hwnd~lenu;
LONG sListSelectFlag;
hwnd~lenu = WinllindowFromID(WinOueryNindow(hwnd, OW_PARENT, FALSE), FID_MENU);
sListSelectFlag = (LONG)WinSen~lsg(41inl1indowFromID(hwnd, ID CLIENT ADSLIST), LM CUERYSELECTION, OL, OL);
/* Enable or disable menu pull downs */
IIinSendhlsg(hwndMenu, MM_SETITEMATTR, MPFROM2SHORT(IDM JOBSCHEDULE, TRUE), MPFROM2SHORT(MIA DISABLED, (sCUrrentView == IDM_VIEHDEFAULT) ? 0 : MIA_DISABLED));
WinSenc~lsg(hwnct~!enu, MM_SETITEMATTR, MPFROM2SHORT(IDM-JOBRESCHED, TRUE), MPFROM2SHORT(MIA_DISABLED, (sCurrentView == 1DM V1ENDEFAULT 88 sListSelectFlag != LIT NONE) ?
0 : MIA_DISABLED));
WinSenctAsg(hwnctAenu, MM_SET1TEMATTR, MPFROM2SHORT(IDM JOBRUSH, TRUE), MPFROM2SHORT(MIA DISABLED, (sCurrentView == IDM VIENDEFAULT 88 sListSelectFlag != LIT NONE) ?
0: MIA_DISABLED));
WinSend~lsg(hwndMenu, MM_SETITEMATTR, MPFROM2SHORT(IDM JOBZOOM, TRUE), MPFROM2SHORT(MIA DISABLED, (sListSelectFlag != LIT_NONE) ? 0: MIA_DISABLED));
NinSendldsg(hwnd~!enu, MM_SETITEMATTR) MPFROM2SHORT(IDM JOBRESUME, TRUE), MPFROM2SHORT(MIA DISABLED, (sCurrentView == IDM VIENDEFAULT 88 sListSelectFlag != LIT NONE) ? 0: MIA_DISABLED));
IIinSenct~lsg(hwndlenu, MM_SETITEMATTR, MPFROMZSHORT(IDM-JOBHOLD, TRUE), MPFROM2SHORT(MIA DISABLED, (sCurrentView == IDM_VIESIDEFAULT 88 sListSelectFlag != LIT_NONE) ? 0: MIA_DISABLED));
WinSer>d~!sg(hwnd~lenu, MM_SETITEMATTR, MPFROM2SHORT(IDM JOBCANCEL, TRUE), MPFROM2SHORT(MIA_DISABLED, (sListSelectFlag != LIT NONE) ? 0: MIA DISABLED));
/* Enable or disable icons */
WinEnablellindow(WinWindowFromID(hwnd, ID CLIENT MGLASS), sListSelectFlag != LIT_NONE);
winEnableWirxJow(IlinllindowFromID(hwnd, ID_CLIENT_GOLIGHT), sCurrentView == IDM_VIEbIDEFAULT 88 sListSelectFlag != LIT NONE);
WinEnableWirxJow(11iM1indowFramID(hwnd, ID_CLIENT_STOPL1GHT), sCurrentView == IDM_VIEIIDEFAULT 88 sListSelectFlag != LIT NONE);
WinEnableWindow(WinllindowFromID(hwnd, ID CLIENT RESCHED), sCurrentView == IOM_VIENDEFAULT 88 sListSelectFlag != LIT NONE);
WinEnableWindow(WiMIindowFromiD(hwnd, ID_CLIENT_RUSH), sCurrentView == IDM_VIEHDEFAULT 88 sListSelectFlag != LIT NONE);
WinEnableWindow(WiMdindowFromID(hwnd, ID CLIENT ERASER), sListSelectFlag != LIT_NONE);
HinEnableNindow(WiMIindowFromID(hwnd, ID CLIENT SCHED), sCurrentView == iDM VIE61DEFAULT);
return;

~' .~ s~ r~1 ~ ~ ; i .x a ~ ~ .~.. .i' ;~

static char szRevisionl7 = "BRevision: 4.6 E BATCH02.C";
/*x**********x***********************x********xx*****x**************x****
* Copyright (c) 1990, 1991, 1992, 1993 American Airlines * File: BATCH02.C
* System: Batch Administration * Description: The Batch Administration program provides a user * interface to Batch Scheduler, allowing users to build, * submit, and query batches.
*********************************x**************************************/
#define DBMSOS2 #define INCL_PM
#define EXTERN extern #include <os2.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sqlfront.h>
#include <sqldb.h>
#include "adslen.h"
#include "ads. h"
#include "adsnet.h"
#include "dialog. h"
#include "batchdef.h"
#include "batchdlg.h"
#include "batch. h"
VOID SetJobStepOptions(HWND);
/*******************x****x**********xx*x*x***************x****x***********x***/

/* */
/* JobListDlgProc */
/* */
/* This dialog box displays the complete list of batch jobs. The user can */
/* create, modify, or delete jobs (assuming he has permission/passwords) */
/* here. The maintenance of the actual job steps occurs within the */
/* JobStepDlgProc */
/************x**xt**x**xxx***********x*****x********x****x******x********x****/

MRESULT EXPENTRY JobListDlgProc(HNND hwnd, USHORT msg, MPARAM mpl, MPARAM mp2) static CHAR szHeadingTop(807;
static CHAR szHeadingBottom(807;
static LONG alColWidth(JBLST COLUMNS7;
USHORT i;
USNORT usNotifyCode;
CHAR abeufferl2507;
DBCHAR JobNamefJOBNAMELENGTH];
DBCHAR JobDesc(JOBDESCLENGTHI;
DBCHAR ProgramName(STEPPRGLENGTH7;
DBCHAR ArglistllSTEPARGSLENGTH7;
DBCNAR encrpt arg(STEPARGSLENGTH7;
DBSMALLINT job step;
CHAR buff(2507;
P~IDSTRUCT pudStruct;
CHAR szTextt(807;
CHAR szText2(807;
static USHORT usPushButtons(JOBLISTNUMBUTTONS7;

a!
'd...L~ ~ .5-. ~ a switch (msg) case IM CONTROL: /*____________________________________________________*/
usNotifyCode = (USHORT) SHORTZFROMMP(mp1);
if (SHORT1FROMMP(mp1) != DID JOBLIST ADSLIST) break;
switch (usNotifyCode) C
/*
* If the user selects a job from the listbox, fill in the * entry fields with the job name and description.
*/
case LN_SELECT: /*________________________________________________*/
if (GetSelectedItemString( hwnd, DID_JOBLIST_ADSLIST, abBuffer, JOBNAMELENGTH, TRUE) < 0) return(0);
WinSetPointer(HNND_DESKTOP, WinOuerySysPointer(HWND DESKTOP, SPTR WAIT, TRUE));
safe_dbfcmd(dbproc, " SELECT"
JobListName,"
" JobListDescr"
" FROM SSJobListTable"
" WHERE JobListName LIKE \"Xs\""
" ORDER BY JobListName", abBuffer);
dbsqlexec(dbproc);
dbresults(dbproc);
dbbind(dbproc, 1, NTBSTRINGBIND) (LONG)sizeof(JobName), JobName);
dbbind(dbproc, 2, NTBSTRINGBIND, (LONG)sizeof(JobDesc), JobDesc);
dbnextrow(dbproc);
WinSetDlgItemText(hwnd, DID_JOBLIST_JOBNAME, JobName);
WinSetDlgItemText(hwnd, DID_JOBLIST_JOBDESC, JobDesc);
SetPushButtons(hwnd, JOBLISTNUMBUTTONS, DID_JOBLIST MODIFY, usPushButtons);
strcpy(buff, JobName);
dbcarxiuery(dbproc);
white (dbresults(dbproc) != NO MORE RESULTS) dbcanquery(dbproc);
/* Selection made, enable buttons */
WinEnableWindow(WinNindowFramID(hwnd, DID_JOBLIST_CLONE), TRUE);
WinEnableWindow(LIirriJindowFromID(hwnd, DID JOBLIST DELETE), TRUE);
HinEnablewindow(WiMdindowFranID(hwnd, DID_JOBLIST MODIFY), TRUE);
IIinSetPointer(HWND DESKTOP, 4)ir>DuerySysPointer(H41ND DESKTOP) SPTR ARROW, TRUE));
break;
/*
* The user has double clicked on a list item, so start the * SSJobStepDlgProc.
*/
case LN_ENTER: /*_________________________________________________*/
if (GetSelectedItemString( hwnd, DID_JOBLIST ADSLIST, abeuffer, JOBNAMELENGTH, TRUE) < 0) return(0);
HinDlgBox(HHND DESKTOP, hwnd, (PFNWP)JobStepDlgProc, (HMOOULE)NULL, IDD_JOBSTEP, (PVOID)abBuffer);
/* Load all of the Job List headers into the listbox */
LoadListBox(hwnd, DID-J08LIST ADSLIST, (PSZ)NULL) (PSZ)NULL, 0);
/* Disable buttons until a selection is made from list box */

I~ eJ ~ ~~ ~'' ~~
~~ a.. i .. a WinEnableHindow(4linHindowFromID(hwnd, DID_JOBLIST_CLONE), FALSE);
WinEnableHindow(l~inWindowFromID(hwnd, DID_JOBLIST DELETE), FALSE);
WinEnable4lindow(WinHindowFromID(hwnd, DID JOBLIST MODIFY), FALSE);
return(0);
/* switch */
break;
case LM_COMMAND: /*____________________________________________________*/
switch (COMMANDMSG(8ansg)->cmd) i case DID_OK: /*___________________________________________________*/
WinDismissDlg(hwnd, TRUE);
return(0);
/*
* CLEAR BUTTON - clears the current listbox selection and * the contents of the two edit fields.
*/
case DID_JOBLIST_CLEAR: /*________________________________________*/
WinSer~lgItemMsg(hwnd, DID JOBLIST ADSLIST, LM_SELECTITEM, (MPARAM)LIT NONE, OL);
WinSetDlgItemText(hwnd, DID JOBLIST JOBNAME, "");
HinSetDlgItemText(hwnd, DID J08LIST JOBDESC, "");
SetPushButtons(hwnd, JOBLISTNUMBUTTONS, DID_JOBLIST_INSERT, usPushButtons);
/* Disable buttons until a selection is made from list box */
WinEnableHindow(Winl~lindowFromID(hwnd, DID_JOBLIST_CLONE), FALSE);
WinEnableHindow(WinWindowFromID(hwnd, DID_JOBLIST DELETE), FALSE);
WinEnableHindow(WinWindowFromID(hwnd, DID JOBLIST MODIFY), FALSE);
WinSetFocus(HWND DESKTOP, WinWindowFramID(hwnd, DID JOBLIST JOBNAME));
return(0);
/*
* INSERT BUTTON - Inserts the data in the Job Name and the * Job Description entry fields into the SSJobListTable.
*/
case DID_JOBLIST_INSERT: /*---------------------------------------*/
if (!WinOueryDlgItemText(hwnd, DID JOBLIST_JOBNAME, JOBNAMELENGTH, JobName)) return(0);
WinGueryOlgItemText(hwnd, DID_JOBLIST_JOBDESC, JOBDESCLENGTH, JobDesc);
HinSetPointer(HWND DESKTOP, SlinOUerySysPointer(HWND DESKTOP, SPTR WAIT, TRUE));
safe_dbfcmd(dbproc, " INSERT INTO SSJoblistTable"
" VALUES (\"Xs\", \"Xs\", user name(-1), getdate(), \"\", \"\")", JobName, JobDesc);
it (dbsqlexec(dbproc)) C
dbcanquery(dbproc);
while (dbresults(dbproc) != NO MORE RESULTS) dbcanquery(dbproc);
/* Clear the entry fields and reload the listbox */
WinSetOlgItemText(hwnd, DID_JOBLIST_JOBNAME, "");
WinSetDlgItemText(hwnd, DID_J08LIST_JOBDESC, "");
LoadListBox(hwnd, DID-JOBLIST ADSLIST, (PSZ)NULL, (PSZ)NULL, 0);

;~ v ~ ~!
~ a s,t .z. _i :. ~.. ".y d /* Assume another insert will follow */
WinSetFocus(HWND DESKTOP, WinHindowFromID(hwnd, DID JOBLIST JOBNAME));
/* Disable buttons until a selection is made from list box */
WinEnableWindow(Win4)indowFromID(hwnd, DID_JOBLIST_CLONE), FALSE);
WinEnableWindow(LIinHindowFromID(hwnd, DID_JOBLIST DELETE), FALSE);
WinEnableWindow(Win4lindowFromID(hwnd, DID_JOBLIST MODIFY), FALSE);
WinSetPointer(HWND DESKTOP, WinOuerySysPointer(HWND DESKTOP, SPTR ARR041, TRUE));
return(0);
/*
* CLONE BUTTON - the currently selected item will be cloned * (ie All of the jobs steps will be copied) to a new job list * whose name and description are obtained from the entry fields.
*/
case DID_JOBLIST_CLONE: /*----------------------------------------*/
if (GetSelectedItemString( hwnd, DID_JOBLIST_ADSLIST, abBuffer, JOBNAMELENGTH) TRUE) < 0) return(0>;
/*
* Get modify access password from user if needed.
*/
pwdStruct.usPwdType = PS1D_MODIFY;
pwdStruct.pszJobData = abeuffer;
pwdStruct.usDataType = P~ID_DATA_JOBNAME;
if (!(WinDlgBox(HWND DESKTOP, hwnd, (PFNWP)EnterPasswordDlgProc, (HMOOULE)NULL, IDD PbIDENTER, (PVOID) &pwdStruct))) /*
* Oops, the users does not know the password, so return.
*/
DosBeep( 300, 300 );
return(0);
/* if */
WinSetPointer(HWND_DESKTOP, HinGuerySysPointer(HWND DESKTOP, SPTR WAIT, TRUE));
WinOueryDlgItemText(hwnd, DID_JOBLIST_JOBNAME, JOBNAMELENGTN, JobName);
WinGueryDlgItemText(hwnd, DID_JOBLIST_JOBDESC, JOBDESCLENGTH, JobDesc);
/* Insert new job header into JobListTable */
safe_dbfcmd(dbproc, " INSERT INTO SSJobListTable"
" VALUES (\"Xs\", \"Xs\", user name(-1), getdate(), \"\", \"\")", JobName, JobDesc);
if (dbsqlexec(dbproc)) dbcanquery(dbproc>;
while (dbresults(dbproc) != NO MORE RESULTS) dbcanquery(dbproc);
/* Select the Job Steps from the original job...*/
safe_dbfcmd(dbproc, " SELECT"
" JobStepNum,"
ProgramName,"
" ArgumentListl,"

m~,.~ ~~~lr ~!
' S '>a a " ArgumentList2"
" FROM SSJobStepTable"
" WHERE JobListName LIKE \"%s\""
" ORDER BY JobStepNum", abBuffer);
dbsqlexec(dbproc);
dbresults(dbproc);
dbbind(dbproc, 1, INTBIND, (DBINT)0, (BYTE *) &job step);
dbbind(dbproc, 2) NTBSTRINGB1ND, (LONG)sizeof(ProgramName), ProgramName);
dbbind(dbproc, 3) NTBSTRINGB1ND, (LONG)sizeof(ArgList1), ArgListl);
dbbind(dbproc, 4, NTBSTRINGBIND, (LONG)sizeof(encrpt arg), encrpt arg);
if (dbnextroW(dbproc) != NO_MORE_RONS) C
if (!(dbtemp = dbopen(pUserAttr->login, pUserAttr->szDefaultServer))) C
4linLoadString(hab, (HMODULE)NULL, IDS_CANT_LOGON, sizeof(szTextl), (PSZ)szTextl);
WinLoadString(hab, (HMODULE)NULL, IDS ERROR, sizeof(szText2), (PSZ)szText2);
NinMessageBox(HWND DESKTOP, HWND_DESKTOP, szTextt, szText2) (USHORT) NULL, MB_OK ~ MB ERROR i M8 MOVEABLE);
dbclose(dbtemp);
WinSetPointer(HWND DESKTOP, 4linGuerySysPointer(HWNO DESKTOP, SPTR ARROW, TRUE));
return(0);
/* if */
dbuse(dbtemp, pUserAttr->szDefaultDe);
/*
* ...And loop through them, reinserting (copy) them into * the SSJobStepTable with our new JobID.
*/
do C
safe_dbfcmd(dbtemp, " INSERT INTO SSJobStepTable"
" VALUES (\"°/.S\". Xd, \"%S\". \"XS\". \"%&\")n, JobName, job step, ProgramName, ArgListl, encrpt arg);
dbsqlexec(dbtemp);
dbresults(dbtemp);
dbcanquery(dbtemp);
while (dbresults(dbtemp) != NO MORE RESULTS) dbcanquery(dbtemp);
while (dbnextrow(dbproc) != NO MORE ROWS);
dbclose(dbtemp>;
) /* if */
/* Clear the entry fields and reload the list box */
WinSetDlgItemText(hund, DID_JOBLIST JOBNAME, "");
WinSetDlgItemText(hwnd, DID JOBLIST JOBDESC, "");
dbcanquery(dbproc);
while (dbresults(dbproc) != NO MORE RESULTS) dbcanquery(dbproc);
LoadListBox(hwnd, DID JOBLIST ADSLIST, (PSZ)NULL, (PSZ)NULL, 0);
/* Disable buttons until a selection is made from list box */
WinEnableWindow(Ilinl~lindowFromID(hwnd, DID-JOBLIST CLONE), FALSE);

:~ ~ ~ ~~'' NinEnable4lindow(NinNindowFromID(hwnd, DID_JOBLIST DELETE), FALSE);
NinEnableNindow(NinuindowFromID(hwnd, DID_JOBLIST MODIFY), FALSE);
NinSetFocus(HNND DESKTOP, NinNindowFromID(hwnd, DID J08LIST JOBNAME));
/* i f */ - _ IJinSetPointer(H41ND_DESKTOP, NinWuerySysPointer(HNND DESKTOP, SPTR AKRON, TRUE));
return(0);
/*
* DELETE BUTTON - Delete the selected Job.
*/
case DID_JOBLIST_DELETE: /*---------------------------------------*/
if (GetSelectedItemString( hwnd, DID_JOBLIST_ADSLIST, abBuffer, JOBNAMELENGTH, TRUE) < 0) return(0);
/*
* Get password from user if needed.
*/
pudStruct.usPudType = PND_MOD1FY;
pwdstruct.pszJobData = abBuffer;
pwdStruct.usDataType = PND_DATA_JOBNAME;
if (!(NinDlgBox(HNND DESKTOP, hwnd, (PFNNP)EnterPasswordDlgProc) (HMODULE)NULL, iDD PNDENTER, (PVOID) BpwdStruct))) C
/*
* Oops, the users does not know the password, so return.
*/
DosBeep( 300, 300 );
return(0);
/* if */
NinSetPointer(HNND_DESKTOP, Nir>DuerySysPointer(HNND DESKTOP) SPTR WAIT, TRUE));
/* Delete the entry from the SSJobListTable */
safe_dbfcmd(dbproc, " DELETE SSJobListTable"
" WHERE JObLISiNBme = \"%s\"", abBuffer);
if (dbsqlexec(dbproc)) C
dbcanquery(dbproc);
while (dbresults(dbproc) != NO MORE RESULTS) dbcanquery(dbproc);
/* and each step from the SSJobStepTable */
safe dbfcmd(dbproc, delete SSJobStepTable"
" WHERE JobListName = \"°/,s\"", abeuffer>;
dbsqlexec(dbproc);
dbcanquery(dbproc);
white (dbresults(dbproc) != NO MORE RESULTS) dbcanquery(dbproc);
LoadListBox(hwnd, DID JOBLIST ADSLIST, (PSZ)NULL, (PSZ)NULL, 0);
/* Disable buttons until a selection is made from list box */
NinEnableNindow(NinNindowFromID(hwnd, OID_JOBLIST_CLONE), FALSE);
NinEnableNindow(NinNindowFromID(hwnd, DID_JOBLIST_DELETE), FALSE);
NinEnableNindow(NinNindowFromlD(hwnd, DID-JOBL1ST-MODIFY), FALSE);

~~ R ="j ~ ~-, ;"i y .G C . J
_88_ /* if */
WinSetDlgItemText(hwnd, DID_JOBLIST JOBNAME, "");
WinSetDlgItemText(hwnd, DID JOBLIST JOBDESC, "");
NinSetPointer(HWND DESKTOP, NinOuerySysPointer(HNND DESKTOP, SPTR ARROW, TRUE));
return(0);
/*
* MODIFY BUTTON - Call the JobStepDlgProc to build or modify * the steps in this job.
*/
case DID_JOBLIST_MODIFY: /*_______________________________________*/
if (GetSelectedItemString( hwnd, DID_JOBLIST_ADSLIST, abBuffer, JOBNAMELENGTH) TRUE) < 0) return(0);
NinDlgBox(HWND_DESKTOP, hwnd, (PFNWP)JobStepOlgProc, (HMODULE)NULL, IDD_JOBSTEP, (PVOIO)abBuffer);
/* Load all of the Job List headers into the listbox */
LoadListBox(hwnd, D1D JOBLIST ADSLIST, (PSZ)NULL, (PSZ)NULL, 0);
/* Disable buttons until a selection is made from list box */
WinEnableWindow(WinWindowFromID(hwnd, DID_JOBLIST_CLONE), FALSE);
HinEnableWindow(WintlindowFromID(hwnd, DID JOBLIST_DELETE), FALSE);
WinEnableWindow(Ilir><lindowFromID(hwnd, DID JOBLIST MODIFY), FALSE);
return(0);
3 /* switch */
break;
case 41M IN1TDLG: /*-___________________________________________________*/
/*
* Set the pointer to the hour glass while we wait...
*/
NinSetPointer(HWND_DESKTOP, WinGuerySysPointer(HWND DESKTOP, SPTR WAIT) TRUE));
/*
* Load the colurtn title strings from the resource.
*/
4linLoadString(hab, (HMODULE)NULL, IDS_J08LIST_LIST1_TOP, sizeof(szHeadingTop), (PSZ)szHeadingTop);
WinLoadString(hab, (HMODULE)NULL, IDS JOBLIST LIST1_BOT, sizeof(szHeading8ottom), (PSZ)szHeadingBottom);
/* Clear the listbox colum widths */
for (i = 0; i < JBSTP_COLUMNS; i++) alColWidth(i) = 0;
/* Save the buttons that live on this dialog box in an array */
usPushButtonsf0) = DID_JOBLIST_CLEAR;
usPushButtons[1) = DID_JOBLIST_1NSERT;
usPushButtons(2) = DID_JOBLIST_CLONE;
usPushButtons(3) = DID_JOBLIST DELETE;
usPushButtonsl4] = DID JOBLIST MODIFY;
usPushButtonsl57 = DID_OK;
/* Set the default button to the OK */
SetPush8uttons(hwnd, JOBLISTNUMBUTTONS, DID OK, usPushButtons);
/* load alt of the Job List headers into the listbox */
LoadListBox(hwnd, DiD_J08LiST ADSLIST, (PSZ)NULL, (PSZ)NULL, 0);
/* Disable buttons until a selection is made from list box */

.'~~~~sl~'~
_89_ WinEnableWindow(WinwindowFromID(hwnd, DID_JOBLIST_CLONE), FALSE);
NinEnableuindow(WinuindowFromID(hwnd, DID_JOBLIST_DELETE), FALSE);
WinEnableNindow(HinWindowFromID(hwnd, DID_JOBLIST-MODIFY), FALSE);
/* Set Maximum entry field lengths */
uinSer>dDlgItemMsg(hwnd, DID_JOBLIST_JOBNAME, EM SETTEXTLIMIT, MPFROMSHORT(JOBNAMELENGTH - 1), OL);
uinSendDlgItemMsg(hwnd, DID_JOBLIST_JOBDESC, EM SETTEXTLIMIT, MPFROMSHORT(JOBOESCLENGTH - 1), OL);
/* Restore the default pointer */
WinSetPointer(HHND DESKTOP, Wir>DuerySysPointer(HHND DESKTOP, SPTR ARROW, TRUE));
return(0);
/* Multicolumn Listbox stuff */
case 41M MEASUREITEM: /*-_______________________________________________*/
switch (SHORT1FROMMP(mp1)) case DID_JOBLIST_ADSLIST: /*_____________________________________*/
return (MRFROMLONG(ADSLBMeasure(hwnd, DID_JOBLIST_ADSLIST, SHORT1FROMMP(mp2), alColHidth, JBLST_COLUMNS, DID_JOBLIST_HEADING, szHeadingTop, szHeadingBottom)));
J /* switch */
return(0);
case 11M_DRAWITEM: /*____________________________________.____________._*/
switch (SHORT1FROMMP(mp1)) case DID_JOBLIST_ADSL1ST: /*------------------------_--_---------*/
ADSLBDraw(hwnd, D1D_JOBLIST_ADSLIST, (POwNERITEM)PVOIDFROMMP(mp2), alColWidth, JBLST_COLUMNS, DID JOBLIST HEADING, FALSE);
return (MRFROMSHORT(TRUE));
/* switch */
return(0);
/* END SWITCH */
return WinDefDlgProc(hwnd, msg, mpl, mp2);
/* END JobLISTDIgProc */
/******x***********x********x*************************************************/

/* */
/* JobStepOlgProc */
/* */
/* If the user has modify priviledges for the current job this dialog */
/* box will appear to allow job steps to be modified. Steps can be added */
/* and the user can specify the parameter list that should be passed to */
/* each step. An encripted parameter field is also provided that will */
/* provide some security for data like uname and passwords that must be */
/* included on an argunent list. The encripted parameter field is stored */
/* in the database in an unreadable format to hide the contents from ISGL */
/* and the tike. */
/*******************************************x**************************x******/

MRESULT EXPENTRY JobStepDlgProc(HHND hwnd, USHORT msg, MPARAM mpt, MPARAM mp2) C
static CHAR szHeadingTopI807;
static CHAR szHeadingeottom[807;
static LONG alColHidth[JBSTP COLUMNS];
USHORT i;
USHORT usNotifyCode;
DBCHAR JobNartie[JOBNAMELENGTH7;
DBCHAR ProgramName[STEPPRGLENGTH7;
DBCHAR ArgListl[STEPARGSLENGTH7;

DBCHAR ArgList2CSTEPARGSLENGTHI;

DBCHAR encrpt argCSTEPARGSLENGTH);

DBCHAR JobStepNunISTEPNUMLENGTH);

LONG stepcount;

CHAR buffC250);

CHAR szText1C80);

CHAR szText2C807;

PNDSTRUCTpwdStruct;

static usPushButtonsCJOBSTEPNUMBUTTONS);
USHORT

DBCHAR TmpJobListNameCJOBNAMELENGTHI;

DBSMALLINTTmpJobStepNum;

DBCHAR TmpProgramNameISTEPPRGLENGTHI;

DBCHAR TmpArgListICSTEPARGSLENGTHI;

DBCHAR TmpArgList2CSTEPARGSLENGTHI;

DBSMALLINTAdjustCount;

switch (msg) case ~lM CONTROL: /*_________________-_________-________________________*/
usNotifyCode = (USHORT) SHORT2FROMMP(mp1);
strcpy(JobName, (PS2)WinOueryWindowULong(hwnd, AWL USER));
if (usNotifyCode == LN_SELECT) switch (SHORT1FROMMP(mp1)) C
/*
* A step has been selected. Fill in the entry fields with * the step data.
*/
case DID_JOBSTEP_ADSLIST: /*--------------------_----_----_____*/
if (GetSelectedltemString( hwnd, DID_JOBSTEP_ADSLIST, JobStepNum, STEPNUMLENGTH, TRUE) < 0) return(0);
WinSetPointer(HWND DESKTOP, WinGuerySysPointer(HWND DESKTOP, SPTR WAIT, TRUE));
safe_dbfcmd(dbproc, " SELECT"
" ProgramName,"
" ArgumentListl,"
" ArgumentList2"
" FROM SSJobStepTable"
" WHERE JobListName LIKE \"Xs\""
" AND JobStepNum = Xd", JobName, atoi(JobStepNum));
~sqtexec(dbproc);
dbresults(dbproc);
dbbind(dbproc, 1, NTBSTRINGBIND) (LONG)sizeof(ProgramName), ProgramName);
~bind(dbproc, 2, NTBSTRINGBIND, (LONG)sizeof(ArgListl), ArgListl);
dbbind(dbproc, 3, NTBSTRINGBIND, (LONG)sizeof(encrpt arg), encrpt arg>;
if (dbnextrow(dbproc) != NO_MORE_ROWS) WinSetDlgItemText(hwnd, DID_JOBSTEP_COMBO) ProgramName);
WinSetDlgttemText(hwnd, DID_JOBSTEP_ARGS1, ArgListt);
/* Decript the arg list before displaying */
ADSEncrypt(encrpt arg, ArgList2);
IIinSetDlgItemText(hwnd, DID JOBSTEP ARGS2, ArgList2);
/* i - -f dbcanquery(dbproc);
while (dbresults(dbproc) != HO MORE RESULTS) i ~~.~~~...3~

dbcanquery(dbproc);
SetJobStepOptions(hwnd);
LIinSetPointer(HWND DESKTOP, WinOuerySysPointer(HWND DESKTOP, SPTR_ARROW, TRUE));
break;
case DID_JOBSTEP COM80:
SetJobStepOptions(hwnd);
break;
/* switch */
/* if */
break;
case NM_COMMAND: /*____________________________________________________*/
strcpy(JobName, (PS2)WinOueryWindouUlong(hwnd, OWL USER));
switch (COMMANDMSG(8msg)->cmd) case DID_OK: /*___________________________________________________*/
4linDismissDlg(hwnd, TRUE);
return(0);
/*
* CLEAR BUTTON - Clear the listbox selection and erase the * contents of the entry fields.
*/
case DID_JOBSTEP_CLEAR: /*--------------------------_--------__---*/
WinSerxDlgItemMsg(hwnd, DID_JOBSTEP ADSLIST, LM_SELECTITEM, (MPARAM)LIT NONE, OL);
uinSetDlgItemText(hwnd, DID_JOBSTEP_COMBO, "");
WinSetDlgItemText(hwnd, DID JOBSTEP_ARGS1) "");
NinSetDlgItemText(hwnd, DID JOBSTEP ARGS2, "");
SetPushButtons(hwnd, JOBSTEPNUMBUTTONS, DID-JOBSTEP_APPEND, usPushButtons);
SetJobStepOptions(hwnd);
4linSetFocus(H41ND DESKTOP, NinlJindowFramID(hwnd, DID JOBSTEP COMBO));
return(0);
/*
* APPEND BUTTON - Take the entryfield data and append the step * list with this new step.
*/
case DIO_J08STEP_APPEND: /*-----------------------------------__--*/
if (lWinOueryDlgItemText(hwnd, DID_JOBSTEP_COM80, STEPPRGLENGTH, ProgramName)) C
NinSetFocus(HHND DESKTOP, WinWindowFromlD(hwnd, DID JOBSTEP COMBO));
return(0);
WinGueryOlgItemText(hwnd, DID JOBSTEP ARGS1, STEPARGSLENGTH, ArgListl);
WinGueryDlgItemText(hwnd) DID_JOBSTEP_ARGS2, STEPARGSLENGTH, ArgList2);
/* This upper limit on the argument list is limited by the OS */
if (strlen(Arglistl) + strlen(Arglist2) > STEPARGSLENGTH) Dos8eep( 400, 50 );
HinLoadString(hab, (HMOOULE)NULL, IDS_T00_LONG, sizeof(szTextl)) (PS2)szTextt);

d j .~ ~ ~ ~ ~ '-!
,, a . ~. ~ a. .:_ _;

4linLoadString(hab, (HMODULE)NULL, IDS WARNING, sizeof(szText2), (PSZ)szText2);
WiN~lessageBox(HWND DESKTOP, hwnd, szTextl, szText2, 0, MB OK ~ MB WARNING ; MB MOVEABLE);
return(0);
/* if */
WinSetPointer(HWND DESKTOP, WinGuerySysPointer(H41ND DESKTOP, SPTR WAIT, TRUE));
/* Encript the second argument list */
ADSEncrypt(ArgList2, encrpt arg);
/* Get the number of job steps already present */
safe_dbfcmd(dbproc, " SELECT count(*)"
" FROM SSJObStepTable"
" WHERE JobLlStName LIKE \"%S\"", JobName);
dbsqlexec(dbproc);
dbresults(dbproc);
dbbind(dbproc, 1, INTBIND, (DB1NT)0, (BYTE *) &stepcount);
dbnextroW(dbproc>;
dbcanquery(dbproc);
while (dbresults(dbproc) != NO MORE RESULTS) dbcanquery(dbproc);
/* Append the new job step */
safe_dbfcmd(dbproc, " INSERT INTO SSJobStepTable"
a VALUES C\"XS\", Xd, \"XS\", \"XS\", \"XS\")u, JobName, (SHORT)(stepcount + 1), ProgramName, ArgList1) encrpt arg);
if (dbsqlexec(dbproc)) C
dbresults(dbproc);
/* Update the modification time */
safe_dbfcmd(dbproc, " UPDATE SSJobListTable"
" SET"
" BuiltBy = user_name(-1),"
" LastMOd = getdate()"
" WHERE JObLiStName = \"XS\"", JobName);
dbsqlexec(dbproc);
dbresutts(dbproc);
/* Clear the entry fields */
llinSetDlgltemText(hwnd, DID_JOBSTEP_COMBO, "");
WinSetDlgItemText(hwnd, DID_JOBSTEP_ARGS1, "");
4linSetDlgItemText(hund, DID JOBSTEP ARGS2, "");
while (dbresults(dbproc) != NO MORE RESULTS) ;
dbcanquery(dbproc);
while (dbresults(dbproc) != NO MORE RESULTS) dbcanquery(dbproc);
/* Reload the list box the the steps for the current job */
strcpy(buff, (PSZ)WinGuerywindorAlLong(hwnd, OWL USER));
LoadlistBox(hwnd, DID-JOBSTEP ADSLIST, SZ ~ ~_ ~ i~
:a y, ~;b , .' J

(PSZ) buff, (PSZ)NULL, 0);
SetJobStepOptions(hwnd);
WinSetFocus(HWND DESKTOP, WinWindowFromID(hwnd, DID JOBSTEP COMBO));
/* t f */ - _ NinSetPointer(H41ND_DESKTOP, NinGuerySysPointer(HNND DESKTOP, SPTR ARR041, TRUE));
return(0); -/*
* UPDATE BUTTON - Modify the selected job step with the * entry field data.
*/
case DID_JOBSTEP_UPDATE: /*---------------------------------------*/
if (GetSelectedltemString( hwnd, DID_JOBSTEP_ADSLIST, JobStepNum, STEPNUMLENGTH, TRUE) < 0) C
WinSetFocus(HWND DESKTOP, WinWindowFromID(hwnd, DID_JOBSTEP COMBO));
return(0); -/* Get the data from the user */
if (!WinOueryDlgItemText(hwnd, DID_JOBSTEP_COMBO, STEPPRGLENGTH, ProgramName)) return(0);
WinOueryDlgItemText(hwnd, DID_JOBSTEP_ARGS1, STEPARGSLENGTH, ArgList1);
WinOueryDlgItemText(hwnd, DID_JOBSTEP_ARGS2, STEPARGSLENGTH, ArgList2);
if (strlen(ArgListl) + strlen(ArgList2) > STEPARGSLENGTH) C
DosBeep( 400, 50 );
WinLoadString(hab, (HMODULE)NULL, IDS_T00_LONG, sizeof(szTextl)) (PSZ)szTextl);
NinLoadString(hab, (HMODULE)NULL) IDS_WARNING, sizeof(szText2), (PSZ>szText2>;
WiMIessageBox(H11ND DESKTOP, hwnd, szTextl, szText2, 0, MB OK ~ MB WARNING ~ MB MOVEABLE);
return(0);
/* if */
WinSetPointer(HHND_DESKTOP, NinOuerySysPointer(HWND DESKTOP, SPTR WAIT, TRUE));
ADSEncrypt ( ArgList2, encrpt arg );
/* Update the selected step */
safe_~fcmd(dbproc, " UPDATE SSJobStepTable"
" SET"
a ProgramName = \"Xs\",u ArgunentListl = \"%s\","
" ArgumentList2 = \"Xs\""
" WHERE JobListName = \"Xs\""
" AND JobStepNum = Xd", ProgramName, Arglistt, encrpt arg, JobName, atoi(JobStepNum));

if (dbsqtexec(dbproc)) {
dbcanquery(dbproc);
while (dbresults(dbproc) != NO_MORE_RESULTS) dbcanquery(dbproc);
/* Update the job modification time. */
safe_dbfcmd(dbproc, " UPDATE SSJobListTable"
" SET"
" BuiltBy = user_name(-t),"
" LastMod = getdate()"
" WHERE JobLISLNartle = \"%S\"", JobName);
dbsqlexec(dbproc);
dbcanquery(dbproc);
while (dbresults(dbproc) != NO MORE RESULTS) dbcanquery(dbproc);
/* Clear the entry fields */
WinSetDlgItemText(hwnd, DID_JOBSTEP_COM80, "");
HinSetDlgItemText(hwnd, DID_JOBSTEP_ARGS1, ""):
WinSetDlgItemText(hwnd, DID_JOBSTEP_ARGS2, "");
strcpy(buff, (PSZ)WinOueryWindowULong(hwnd, OWL USER));
/* ReLoad the listbox to reflect the changes */
LoadListBox(hwnd, DID_JOBSTEP ADSLIST, (PSZ) buff, (PSZ)NULL, 0);
SetJobStepOptions(hwnd);
WinSetFocus(H41ND DESKTOP, WinWindowFromID(hwnd, DID JOBSTEP COM80));
/* i f *~
WinSetPointer(HwND DESKTOP, WinGuerySysPointer(HHND DESKTOP, SPTR ARROW, TRUE));
return(0);
/*
* INSERT BUTTON - Insert a job step BEFORE the currently * selected step.
*/
case DID_JOBSTEP_INSERT: /*---------------------------------------*/
if (GetSelectedItemString( hwnd, DID_JOBSTEP_ADSLIST, JobStepNum, STEPNUMLENGTH, TRUE) < 0) C
4linSetFocus(HWND DESKTOP, 4linWindowFromlD(hwnd, DID JOBSTEP COMBO));
return(0);
/* Get the user input data */
if (!Wir>DueryDlgItemText(hwnd, DID JOBSTEP COMBO, STEPPRGLENGTH, ProgramName)) return(0);
NinOueryDlgItemText(hwnd, DID JOBSTEP_ARGS1, STEPARGSLENGTH, ArgListl);
HinOueryDlgItemText(hwnd, DID_JOBSTEP_ARGS2) STEPARGSLENGTH, Argt.ist2);
/* Make sure that the combined arg lists are not too big */
if (strlen(ArgListl) ; strlen(Arglist2) > STEPARGSLENGTH) DosBeep( 400, SO );
WinLoadString(hab, (HMODULE)NULL) IDS T00-LONG, YJ ..~ ~:,5 . , sizeof(szTextl), (PSZ)szText1);
WinLoadString(hab, (HMODULE)NULL, IDS_WARNING, sizeof(szText2), (PSZ)szText2);
4linMessageBox(HNND DESKTOP, hwnd, szTextl, szText2, 0, MB OK i MB WARNING i MB MOVEABLE);
return(0);
J /* if */
NinSetPointer(HWND DESKTOP, WinUuerySysPointer(HWND DESKTOP, SPTR WAIT, TRUE));
ADSEncrypt(ArgList2, encrpt arg);
/* must make room for the item to be inserted */
/* this is done by deleting rows >= JobStepNun and */
/* re-inserting them with JobStepNum incremented */
/* Get the number of job steps already present */
safe_dbfcmd(dbproc, " SELECT count(*)"
" FROM SSJobStepTable"
" WHERE JobListName LIKE \"%s\"", JobName);
dbsqlexec(dbproc);
dbresults(dbproc);
dbbind(dbproc, 1, INTBIND, (DBINT)0, (BYTE *) &stepcount);
dbnextrow(dbproc);
dbcanquery(dbproc);
while (dbresults(dbproc) != NO MORE RESULTS) dbcanquery(dbproc>;
while (stepcount >= atoi(JobStepNum)) l safe_dbfcmd(dbproc, " SELECT *"
" FROM SSJobStepTable"
" WHERE JoblistName = \"Xs\""
" AND JobStepNum = Xd", JobName, (DBSMALLINT)stepcount);
if (dbsqlexec(dbproc) _= FAIL) continue;
dbresults(dbproc);
dbbind(dbproc, 1, NTBSTRINGBIND, (LONG)sizeof(TmpJobListName), TmpJobListName);
dbbind(dbproc, 2, SMALLBIND, (LONG)sizeof(TmpJobStepNum), (BYTE *)&TmpJobStepNum);
dbbind(dbproc) 3, NTBSTRINGBIND, (LONG)sizeof(TmpProgramName), TmpProgramName);
dbbind(dbproc, 4, NTBSTRINGBIND, (LONG)sizeof(TmpArgListl), TmpJlrgListl);
dbbind(dbproc, 5, NTBSTRINGBIND, (LONG)sizeof(TmpArglist2), TmpArgList2);
dbnextrow(dbproc);
dbcanquery(dbproc);
while (dbresults(dbproc) != NO MORE RESULTS) dbcanquery(dbproc);
/* delete the current record */
safe_dbfcmd(dbproc, " DELETE SSJobStepTable"
" WHERE JobListName = \"Xs\""
" AND JobStepNum = Xd", :~a ... ca ~

TmpJobListName, TmpJobStepNun);
dbsqlexec(dbproc);
dbcanquery(dbproc);
while (dbresults(dbproc) != NO MORE RESULTS) dbcanquery(dbproc);
/* increment the job step and re-insert into table */
TmpJ obStepNurrw+;
safe_dbfcmd(dbproc, " INSERT INTO SSJobStepTable"
VALUES (\"%s\". %d. \"%s\". \"%s\". \"%s\")°, TmpJobListName, TmpJobStepNum, TmpProgramName, TmpArgListl, TmpArgList2);
dbsqlexec(dbproc);
dbcanquery(dbproc);
while (dbresults(dbproc) != NO MORE RESULTS) dbcanquery(dbproc);
stepcount--;
/* Insert new step into the SSJobStepTable at JobStepNum */
safe_dbfcmd(dbproc, " INSERT INTO SSJobStepTable"
" VALUES (\"Xs\". %d. \"Xs\". \"Xs\". \'~Xs\")'~, JobName, (DBSMALLINT)atoi(JobStepNum), ProgramName, ArgListl, encrpt arg);
if (dbsqlexec(dbproc)) dbcanquery(dbproc>;
while (dbresults(dbproc) != NO MORE RESULTS) dbcanquery(dbproc);
/* Update job modification time and date */
safe_dbfcmd(dbproc, " UPDATE SSJobListTable"
" SET'~
Builtey = user_name(-1),"
" LastMod = getdate()"
" WHERE JObLIStNartle = \"%S\'~'~, JobName);
dbsqlexec(dbproc);
~canquery(dbproc);
while (dbresults(dbproc) != NO MORE RESULTS) dbcanquery(dbproc);
/* Clear the entry fields */
WinSetDlgItemText(hwnd, DID_JOBSTEP COMBO, "");
WinSetDlgItemText(hwnd, DID_J08STEP ARGS1, "");
WinSetOlgItemText(hwnd, DID JOBSTEP ARGS2, "");
strcpy(buff, (PSZ)NinOueryllindouULong(hwnd, NHL USER));
/* Reload the listbox to reflect the changes */
LoadListBox(hwnd, DID_JOBSTEP_ADSLIST, (PSZ) buff, (PSZ)NULL, 0);
SetJobStepOptions(hwnd);
WinSetFocus(HWND DESKTOP, WinWindowFromID(hwnd, DID JOBSTEP COMBO));

~'.~~ ~~.~~;1 ) /* i f */
WinSetPointer(HIJND DESKTOP, Win~uerySysPointer(HWND DESKTOP, SPTR ARROW, TRUE));
return(0);
/*
* DELETE BUTTON - Delete the currently selected Job Step, * without clearing the data from the entry fields to allow the * user to reverse this action.
*/
case DID_JOBSTEP_DELETE: /*---------------------------------------*/
if (GetSelectedltemString( hwnd, DID_JOBSTEP_ADSLIST, JobStepNum, STEPNUMLENGTH, TRUE) < 0 ) C
4linSetFocus(HWND DESKTOP, WinWindowFromlD(hwnd, DID JOBSTEP COMBO));
return(0);
HinSetPointer(H41ND_DESKTOP, NinOuerySysPointer(HWND DESKTOP, SPTR WAIT, TRUE));
/* Delete the step from the JobStepTable */
safe_dbfcmd(dbproc, " DELETE SSJobStepTable"
" WHERE JobListName = \"Xs\""
" AND JobStepNun = Xd", JobName, atoi(JobStepNun));
dbsqlexec(dbproc);
dbcanquery(dbproc);
while (dbresults(dbproc) != NO MORE RESULTS) dbcanquery(dbproc);
/* get the number of Job Steps */
safe_dbfcmd(dbproc, " SELECT count(*)"
" FROM SSJobStepTable"
" WHERE JobLiStName LIKE \"Xs\"", JobName);
dbsqlexec(dbproc);
dbresults(dbproc);
dbbind(dbproc, 1, INTBIND, (DBINT)0, (BYTE *) &stepcount);
dbnextrow(dbproc);
dbcanquery(dbproc);
while (dbresults(dbproc) != NO HORE RESULTS) dbcarquery(dbproc);
AdjustCount = atoi(JobStepNum);
TmpJobStepNun = AdjustCount;
while (AdjustCount <_ (DBSMALLINT)stepco~t) TmpJobStepN~m++;
safe_dbfcmd(dbproc, " SELECT *"
" FROM SSJobStepTable"
" WHERE JobListName = \"Xs\""
" AND JobStepNum = Xd", JobName, TmpJobStepNum);
dbsqlexec(dbproc);
dbresults(dbproc);

dbbind(dbproc, 1, NTBSTRINGBIND, (LONG)sizeof(TmpJobListName), TmpJobListName);
dbbind(dbproc, 2, SMALLBIND, (LONG)sizeof(TmpJobStepNun), (BYTE *)&TmpJobStepNum);
dbbind(dbproc, 3, NTBSTRINGBIND, (LONG)sizeof(TmpProgramName), TmpProgramName);
dbbind(dbproc, 4, NTBSTRINGBIND, (LONG)sizeof(TmpArgListl)) TmpArgListl);
dbbind(dbproc, 5, NTBSTRINGBIND, (LONG)sizeof(TmpArgList2), TmpArglist2);
if (dbnextrow(dbproc) _= FAIL) continue;
dbcanquery(dbproc);
while (dbresults(dbproc) != NO MORE RESULTS) dbcanquery(dbproc);
/* delete the current record */
safe_dbfcmd(dbproc, " DELETE SSJobStepTable"
" WHERE JobListName = \"%s\""
" AND JobStepNum = %d") TmpJobListName, TmpJobStepNum);
dbsqlexec(dbproc);
dbcanquery(dbproc);
while (dbresults(dbproc) != NO MORE RESULTS) dbcanquery(dbproc);
/* re-insert into table */
safe_dbfcmd(dbproc, " INSERT INTO SSJobStepTable"
a VALUES (\"XS\". W \"XS\". \"XS\", \"XS\")n, TmpJobListName, AdjustCount, TmpProgramName, TmpJlrgListl, TmpArgList2);
dbsqlexec(dbproc);
dbcanquery(dbproc>;
while (dbresults(dbproc) != NO MORE RESULTS) dbcanquery(dbproc);
AdjustCount++;
/* Update the Job modification time and date */
safe_dbfcmd(dbproc, " UPDATE SSJobListTable"
" SET"
BuiltBy = user_name(-1),"
" LastMod = getdate()"
" WHERE JobListName = \"Xs\"", JobName);
dbsqlexec(c#~proc>;
dbcanquery(dbproc);
while (dbresults(dbproc) != NO MORE RESULTS) dbcanquery(dbproc);
strcpy(buff) (PSZ)WinOuery4lindowULong(hwnd, GWL USER));
/* Reload the list to reflect the changes */
LoadlistBox(hwnd, DID_JOBSTEP_ADSLIST, (PSZ) buff, (PSZ)NULL, 0);
SetJobStepOptions(hwnd);
WinSetDlgItemText(hwnd, DID_JOBSTEP COMBO, "");

_99_ WinSetDlgItemText(hwnd, DID_JOBSTEP_ARGS1, "");
4linSetDlgItemText(hwnd, DID_JOBSTEP ARGS2, "");
WinSetPointer(HNND_DESKTOP, WinOuerySysPointer(H41ND DESKTOP) SPTR ARROW, TRUE));
return(0);
/*
* PASSIIORDS... BUTTON calls the SetPasswordDlgProc to enable * the user to set, modify, or delete passwords for limiting * access to modifications of, or the scheduling of, the current * job.
*/
case DID_JOBSTEP_PASSIIORDS: /*--------------------------_-------_-*/
/* last parameter here is the JobID */
Wi M lgBox(HWND_DESKTOP, hwnd, (PFNUP)SetPasswordDlgProc, (HMODULE)NULL, IOD_P41DSET, (PVOID)WinOuerylrindowULong(hwnd, GWL USER));
/*
* Set the on-screen indicators to reflect the new status * (i.e. existence of) the modification and scheduling * passwords.
*/
SetPasswordFlags(hwnd, JobName, dbproc);
return(0);
/* switch */
break;
case t1M_INITDLG: /*____________________________________________________*/
/*
* Get password from user if needed. If the user does not * know the modify password for this job we will not create * the JobStepDlgProc nor will we display the job steps or * arguments.
*/
pwdStruct.usPwdType = PtID_MODIFY;
pwdStruct.pszJobOata = (PSZ)PVOIDFROMMP(mp2);
pwdStruct.usDataType = PI~D_DATA_JOBNAME;
if (!(WinDlgBox(HWND DESKTOP, hwnd, (PFNWP)EnterPasswordDlgProc, (HMODULE)NULL, IDD PIIDENTER, (PVOID) BpudStruct))) /' * Oops, the users does not know the password, so return.
*/
DosBeep( 300, 300 );
llinDismissDlg(hwnd, TRUE);
return(0);
/* if */
/* Change the pointer to the hour glass */
WinSetPointer(HWNO DESKTOP, NinauerySysPointer(HSrND DESKTOP, SPTR WAIT, TRUE));
/*
* Load the column title strings from the resource.
*/
WinLoadString(hab, (HMODULE)NULL, IDS_JOBSTEP_LIST1_TOP, sizeof(szHeadingTop), (PSZ)szHeadingTop);
NinLoadString(hab, (HMOOULE)NUIL, IDS_JOBSTEP_LIST1_BOT, sizeof(szHeadingBottom), (PSZ)szHeadingBottam);
/* Clear the column widths for the multicolum listbox */
for (i = 0; i < JBSTP_COLUMNS; i++) alColWidthCi) = 0;
/* Store the button ids in an array */
usPushButtonsl0) = DID_JOBSTEP CLEAR;

usPushButtonsll7 = DID_JOBSTEP_APPEND;
usPushButtonsl27 = DID_JOBSTEP_INSERT;
usPushButtonsl37 = DID_JOBSTEP UPDATE;
usPushButtonsl4l = DID_JOBSTEP DELETE;
usPushButtonsl57 = DID-OK;
/* Set the button keyboard default to OK */
SetPushButtons(hWnd, JOBSTEPNUMBUTTONS, DID OK, usPushButtons);
/* Save Job Name */
NinSetNindowULong(hund, OWL USER, LONGFROMMP(mp2));
/* Set dialog box title bar */
NinLoadString(hab, (HMODULE)NULL, IDS_JOB_NAME, sizeof(buff)) buff);
sprintf(buff, "%s: %s", buff, (PSZ) PVOIDFROMMP(mp2));
uinSetNindowText(hund, buff);
/* Load the job steps into the main listbox on the dlg */
LoadListBox(hund, DID_JOBSTEP_ADSLIST, (PSZ) PVOIDFROMMP(mp2)) (PSZ)NULL, 0);
/*
* Load the registered executable program names into the * combo box. (Nothing outside of this list will be acceptable.) */
LoadListBox(hWnd, DID JOBSTEP COMBO, (PSZ) "ALL", (PSZ)NULL, 0);
SetJobStepOptions(hund);
/* Set Maximum entry field lengths */
uinSendDlgItemMsg(hwnd, DID_JOBSTEP_ARGS1, EM SETTEXTLIMIT, MPFROMSHORT(STEPARGSLENGTH - 1), OL);
WinSencDlgItemMsg(hwnd, DID_JOBSTEP ARGS2, EM SETTEXTLIMIT, MPFROMSHORT(STEPARGSLENGTH - 1), OL);
/* Set the on-screen password indicators */
SetPassWOrdFlags(hwnd, (PSZ) PVOIDFROMMP(mp2), dbproc);
/* Restore the pointer to the default */
WinSetPointer(HWND_DESKTOP, 4lir>DuerySysPointer(HNND DESKTOP, SPTR ARR011, TRUE));
return(0);
/* Multicolumn listbox stuff */
case SM_MEASUREITEM: /*________________________________________________*/
switch (SHORT1FROMMP(mp1)) case DID_JOBSTEP_ADSLIST: /*-____________________________________*/
return (MRFROMLONG(ADSLBMeasure(hwnd, DID_JOBSTEP_ADSLIST, SHORT1FROMMP(mp2), alColWidth) JBSTP_COLUMNS, DID_JOBSTEP_HEADING, szHeedingTop, szHeadingBottom))>;
/* switch */
return(0);
case bM DRAWITEM: /*-__________________________________________________*/
snitch (SHORT1FROMMP(mp1)) case DID_JOBSTEP_ADSLIST: /*-------------------------------------*/
ADSLBDraw(hWnd, DID_JOBSTEP_ADSLIST, (POWNERITEM)PVOIDFROMMP(mp2), alColWidth, JBSTP_COLUMNS, DID JOBSTEP HEADING, FALSE);
return (MRFROMSHORT(TRUE));
/* switch */
return(0);
/* END SWITCH */
return WinDefDlgProc(hund, msg, mpl, mp2);

~.~.'~xo -10l-/* END JobStepDlgProc */
/**************************************************************************
***/
/* */
/* EnterPasswordDlgProc */
/* */
/* This routine creates a small dialog box that prompts the user to enter */
/* password. Since password locks can be created on both the modification */
/* and the scheduling of a job, the usPwdType member of the PNDSTRUCT */
/* identifies the type of password to be queried: P41D MODIFY or PWD_SCHED. */
/* The password can be checked if the actual job name is provided or if */
/* a JobRunId is provided (the job name will be located automatically. */
/* */
/* Set the usDataType member to P41D_DATA_JOBNAME if the job name text is */
/* being passed in member pszJobData. Set usDataType to P41D DATA JOBID */
/* if the job id is placed in member pszdobData. */
/*****************************************************************************/

MRESULT EXPENTRY EnterPasswordDlgProc(HNND hwnd, USHORT msg, MPARAM mpl) MPARAM mp2) DBCHAR input_passwordlPASSNORDLENGTH7;
static DBCHAR ModifyPud(PASS410RDLENGTH7;
static DBCHAR SchedPwd(PASS410RDLENGTH];
static DBCHAR JobNameIJOBNAMELENGTHI;
CHAR buffl(PASShIORDLENGTH7;
PLN STRUCT *ppwdStruct;
switch (msg) case NM_INITDLG: /*____________________________________________________*/
WinSetPointer(HWND_DESKTOP, WinGuerySysPointer(HWND DESKTOP, SPTR WAIT, TRUE));
/*
* If the user is an administrator (ie the IDM ADMIN menu exists), * we will not ask for the password.
*/
if (GBL6Admin) WinDismissDlg(hwnd, TRUE);
/* Set Max number of characters of the entry field */
NinSenc>blgItemMsg(hwnd, DID_PNDENTER_ENT1, EM SETTEXTLIMIT) MPFROMSHORT(PASSHORDLENGTH - 1), OL);
/* Save Structure Pointer */
NinSetWindowULong(hwnd, OWL_USER, LONGFROMMP(mp2));
ppwdStruct = (PIdDSTRUCT *) LONGFROMMP(mp2);
/************x*********************x**x***************************
* At this point we don~t yet know if a password has been set for * this job. Lets check.
*************************************************x***************/
/*
* If we have been given a job ID rather than the JobName, look up * the JobHame...
*/
if (ppwdStruct->usDataType == PbID DATA_JOBID) C
safe_dbfcmd(dbproc, " SELECT"
" PT.JobListName,"
" MOdPwd,u " SchedPwd"
" FROM SSPendingJobTable PT, SSJobListTable"

" WHERE PT.JobListName = SSJobListTable.JobListName"
" AND JobRunID = %ld", atol(ppwdStruct->pszJobData));
dbsqlexec(dbproc);
dbresults(dbproc);
dbbind(dbproc, 1, NTBSTRINGBIND, (LONG)JOBNAMELENGTH, JobName);
dbbind(dbproc, 2, NTBSTRINGBIND, (LONG)sizeof(ModifyPud), ModifyPwd);
dbbind(dbproc, 3, NTBSTRINGBIND, (LONG)sizeof(SchedPwd), SchedPwd);
dbnextrow(dbproc);
dbcanquery(dbproc);
while (dbresults(dbproc) != NO MORE RESULTS) dbcanquery(dbproc);
/* i f */
/*
* Else the JobName was provided.
*/
else C
safe_dbfcmd(dbproc, " SELECT"
" MOdPwd,°
" SchedPwd"
" FROM SSJobListTable"
" WHERE JobListName LIKE \"XS\"", ppudStruct->pszJobOata);
dbsqlexec(dbproc);
dbresults(dbproc);
dbbind(dbproc, t, NTBSTRINGBIND, (LONG)sizeof(ModifyPud), ModifyPwd);
dbbind(dbproc, 2, NTBSTRINGBIND, (LONG)sizeof(SchedPwd), SchedPwd);
dbnextrow(dbproc);
dbcanquery(dbproc);
while (dbresults(dbproc) != NO MORE RESULTS) dbcanquery(dbproc);
/* else */
/*
* Check type of password check needed. If password exists * (ie >= 6 chars) continue, else this dialog is not needed.
*/
if (ppwdStruct->usPwdType == P41D MODIFY) if (strlen(ModifyPwd) < 6) WiroismissDlg(hwnd, TRUE);
/* i f */
else if (strlen(SchedPud) < 6) WinDismissDlg(hwnd, TRUE);
WinSetPointer(HWND DESKTOP, uinGuerySysPointer(HWNO DESKTOP, SPTR ARROW, TRUE));
return(D);
case HM_COMMAND: /*____________________________________________________*/
switch (COMMANDMSG(&msg)->cmd) C
case DID_CANCEL: /*_______________________________________________*/
winDismissDlg(hwnd, FALSE);
return(O);
case DID_OK: /*________________.__________________________________*/
HinOueryDlgItemText(hwnd, DID_P11DENTER_ENT1) PASSI,IORDLENGTH, input-password);
ADSEncrypt(input-password, buffl);
ppudStruct = (PNDSTRUCT *) uin0ueryWindowULong(hwnd, a4lL USER);

i ~~ :~'~~~ ~~~
,., . ~ _ /*
* Check type of password check needed and compare with correct * database field.
*/
if (ppwdStruct->usPwdType == PI~D MODIFY) WinDismissDlg(hwnd, strcmp(buffl, ModifyPwd) _= 0);
else uinDismissDlg(hwnd, strcmp(buffl, SchedPud) _= 0);
return(0);
/* switch */
/* switch */
return WiroefDlgProc(hwnd, msg, mpl, mp2);
/* END */
/********x*********x****************x******x***********x*******x******x*******/

/* */

/* SetPasswordDlgProc */

/* */

/* This routine creates a dialog box that lets */
the user set job modification /* and scheduling passwords. Since these passwords*/
are entered into fields /* that do not allow the user to see what he */
has typed, a verify field /* is used to help reduce typing errors. To */
delete a password the user /* delete alt of the * placeholders from both */
the password field and from /* verification field. */

/* */

/* The passwords are encripted here before being*/
saved in the database.

/****************x**x*********************x****************************xt*****/

MRESULT EXPENTRY SetPasswordDlgProc(HHND hwnd, USHORT msg, MPARAM mpl, MPARAM mp2) C

DBCHAR ModifyPwd[PASSIIORDLENGTH);

DBCNAR modify verify[PASSIIORDLENGTH7;

DBCHAR SchedPwd[PASSHORDLENGTH1;

DBCHAR JobName[JOBNAMELENGTH);

DBCHAR sched_verify[PASSWORDLENGTH7;

SHORT sModLength;

SHORT sSchLength;

CHAR buffl[PASSIIORDLENGTH);

CHAR buff2[PASSHORDLENGTH];

CHAR szTextl[801;

CHAR szText2[80);

switch (msg) C
case IM_INITDLG: /*____________________________________________________*/
WinSetPointer(HWND DESKTOP, WinGuerySysPointer(HWND DESKTOP, SPTR WAIT, TRUE));
/* Set text limits for the four entry fields *%
WinSerxDlgItemMsg(hwnd, DID_P41DSET_ENT1, EM SETTEXTLIMIT, MPFROMSHORT(PASSNORDLENGTH - 1), OL);
HinSerxblgltemMsg(hwnd, DID_PI~IDSET_ENT2, EM SETTEXTLIMIT, MPFROMSHORT(PASS110RDLENGTH - 1), OL);
WinSer~lgltemMsg(hwnd, DID_PbIDSET_ENT3, EM SETTEXTLIMIT, MPFROMSHORT(PASSHORDLENGTH - 1), OL);
uinSer>dDlgItemlAsg(hwnd, DID_PNDSET_ENT4, EM SETTEXTLIMIT, MPFROMSHORT(PASS410ROLENGTH - 1), OL);
/* Save Job Name */
WinSetWindowULong(hwnd, AWL USER, LONGFROMMP(mp2));
/* Ouery the SSJoblistTable for the passwords for JobName */
safe dbfcmd(dbproc, " SELECT"

-104- ~ ~, c~
" MOdPwd,"
" SchedPud"
" FROM SSJobListTable"
" WHERE JobListName LIKE \"%s\"", LONGFROMMP(mp2));
dbsqlexec(dbproc);
dbresults(dbproc);
dbbind(dbproc, 1, NTBSTRINGBIND, (LONG)sizeof(ModifyPwd), ModifyPwd);
dbbind(dbproc, 2, NTBSTRINGBIND, (LONG)sizeof(SchedPud), SchedPwd);
/*
* Set the entry fields to the existing passwords. These will * really only show a character count.
*/
if (dbnextrow(dbproc) != NO_MORE_ROLIS) ADSEncrypt(ModifyPwd, buffl);
uinSetDlgItemText(hwnd, DID_PI~1DSET_EHT1, buff1);
NinSetDlgItemText(hwnd, DID PNDSET-ENT2, buffl);
ADSEncrypt(SchedPwd, buffl);
WinSetD.lgItemText(hwnd, DID PWDSET_ENT3, buffl);
4linSetDlgItemText(hwnd, DID PNDSET ENT4, buffl);
J /* i - -f *~
dbcanquery(dbproc);
while (dbresults(dbproc) != NO MORE RESULTS) dbcanquery(dbproc>;
WinSetPointer(HWND DESKTOP, WinOuerySysPointer(HIIND DESKTOP, SPTR ARR011, TRUE));
return(0);
case M~1_COMMAND: /*____________________________________________________*/
switch (COMMANDMSG(8msg)->cmd) C
/* The user is committing to his changes */
case DID OK: /*___________________________________________________*/
strcpy(JobName, (PSZ)WinOueryHindouULong(hwnd, GWL USER));
/,r --* Check the length of the modify password. If it exists * (ie length is greater than 0, it must be at least 6 * characters in length.
*/
sModLength = 41in0ueryDlgItemText(hwnd, DID_PIIDSET ENT1) PASSI~IORDLENGTH, ModifyPwd);
if (sModlength > 0) it (sModLength < 6) DosBeep( 400, 50 );
WinLoadString(hab, (HhIODULE)NULL, IDS_MOOP11D_SHORT, sizeof(szTextl), (PSZ)szTextt);
IIinLoadString(hab, (HMODULE)NULL, 1DS WARNING, sizeof(szText2), (PSZ)szText2);
WiNAessageBox(HWND DESKTOP, hwnd, szTextl) szText2, 0, MB OK ; MB WARNING ; MB MOVEABLE);
return(0);
/* i f */
/* Try to verify the password */
NinOueryDlgItemlext(hwnd, DID_P1JDSET_ENT2, PASSNORDLENGTH, modify verify);
if (strcmp(ModifyPwd, modify verify) != 0) WinLoadString(hab, (HMODULE)NULL, IDS_M00_NOVERIFY, sizeof(szTextl), (PSZ)szTextl);
WinLoadString(hab, (HMOOULE)NULL, IDS WARNING, sizeof(szText2)) (PSZ)szText2);
WinMessageBox(HWND DESKTOP, hwnd, szText1, szText2, 0, MB OK i MB WARNING i MB MOVEABLE);
return(0);
/* if */
/* if */
/*
* Same discussion here for the length and verification of * the scheduling password.
*/
sSchLength = Wir>QueryDlgItemText(hwnd, DID_PNDSET ENT3, PASSbIORDLENGTH, SchedPud);
if (sSchlength > 0) if (sSchLength < 6) C
DosBeep( 400, 50 );
WinLoadString(hab, (HMODULE)NULL, IDS SCHPHD SHORT, sizeof(szTextt), (PSZ)szTextl);
winLoadString(hab, (HMODULE)NULL, IDS WARNING, sizeof(szText2), (PSZ)szText2);
wiMlessageBox(HWND DESKTOP, hwnd, szText1, szText2, 0, MB OK i MB WARNING ~ MB MOVEABLE);
return(0);
/* if */
WinOueryOlgItemText(hwnd, DID_PNDSET_ENT4) PASS~IORDIENGTH, sched_verify);
if (strcmp(SchedPwd) sched_verify) != 0) WinLoadString(hab, (HMODULE)NULL, IDS SCH_NOVERIFY, sizeof(szTextl), (PSZ)szTextl);
WinloadString(hab, (HMODULE)NULL, IDS_WARHING, sizeof(szText2), (PSZ)szText2);
4lirYAessageBox(H41N0 DESKTOP, hwnd, szTextl, szText2, 0, MB OK ; MB WARNING ; MB MOVEABLE);
return(0);
/* it *l /* if */
HinSetPointer(HWND DESKTOP, WinOuerySysPointer(HWND DESKTOP, SPTR WAIT, TRUE));
ADSEncrypt(ModifyPwd, buffl);
ADSEncrypt(SchedPwd, buff2);
safe_dbfcmd(dbproc, " UPDATE SSJobListTable"
" SET"
a ModPwd = \"Xs\",o " SChedPwd = \"Xs\","
" BuiltBy = user_name(-1),"
" LastMod = getdate()"
" WHERE JobListName = \"Xs\"", buffl, buff2, JobName);
dbsqlexec(dbproc);
dbcanquery(dbproc);
while (dbresults(dbproc) != NO MORE RESULTS) dbcanquery(dbproc);
WinSetPointer(HWND DESKTOP, uir~uerySysPointer(HHND DESKTOP, SPTR ARR011, TRUE));
winDismissDlg(hwnd, TRUE);
return(0);
/* switch */

/* switch */
return WinDefDlgProc(hwnd, msg, mpl, mp2);
/* END */

/*****************************************************************************/

/* */

/* SetPasswordFlags */

/* */

/* This routine sets the on-screen flags that */
indicate the existence of /* passwords for the current job. */

/*****************************************************************************/

VOID SetPasswordFlags(NWND hwnd, DBCHAR * JobName, DBPROCESS * dbproc)( DBCHAR ModifyPwdIPASS1(ORDLENGTH7;

DBCHAR SchedPwdIPASSNORDLENGTH7;

CHAR buff(357;

WinSetPointer(HWND DESKTOP, 41in0uerySysPointer(HWND DESKTOP, SPTR WAIT, TRUE));

/* Cuery the passwords for the job */

safe_dbfcmd(dbproc) " SELECT"

" ModPwd, " SchedPwd"

" FROM SSJobListTable"

" WHERE JobListName LIKE \"Xs\"", JobName);

dbsqlexec(dbproc);

dbresults(dbproc);

dbbind(dbproc, 1, NTBSTRINGBIND, (LONG)sizeof(ModifyPwd), ModifyPwd);

dbbind(dbproc, 2, NTBSTRINGBIND, (LONG)sizeof(SchedPwd), SchedPwd);

if (dbnextrow(dbproc) != NO MORE ROWS) C

/* if the password exists) show the text flag */

ADSEncrypt(ModifyPwd, buff);

if (strlen(buff) > 1) 4linSetDlgItemText(hwnd, DID JOBSTEP RESTRICT1, "Modify");

else WinSetDlgItemText(hwnd, DID JOBSTEP RESTRICTt, "");

ADSEncrypt(Sche~wd, buff);

if (strlen(buff) > 1) WinSetDlg7temText(hwnd, DID_JOBSTEP RESTRICT2, "Schedule");

else 4linSetDlgItemText(hwnd, DID JOBSTEP RESTRICT2) "");

/* i f *~

dbcanquery(~proc);

while (dbresults(dbproc) != NO MORE RESULTS) dbcanquery(~proc );

WinSetPointer(HWND_DESKTOP, 41in0uerySysPointer(NNND DESKTOP, SPTR ARROW, TRUE));

return;

/* SetPasswordFlags */

/*******x****************************************************************t****/

/* */

/* ResumeDlgProc */

/* */

/* This dialog proc is designed to allow a */
user to resume a held job. This ~' ~ ~'~ ~ ~' /* can occur at the next logical step, or the job can resume at any step. */
/* The user can skip steps altogether or temporarily modify the flow of */
/* execution of the job. In addition the user can place the job in a single */
/* step mode Which will allow the job to execute one step before it is */
/* automatically held by the Batch Server. */
/* */
/********************************************,r********************************
/
MRESULT EXPENTRY ResumeDlgProc(HWND hand, USHORT msg, MPARAM mpl, MPARAM mp2) C
static CHAR szHeadingTopl80);
static CHAR szHeadingBottoml80);
static LONG alColWidthIRESUME COLUMNS);
static PSZ qualptr;
USHORTi;

USHORTiStepNum;

USHORTiSearchSelect;

USHORTusNotifyCode;

DBCHARJobRunID(JOBIDLENGTH);

DBCHARJobListName(JOBNAMELENGTH);

DBCHARStepNumISTEPNUMLENGTH7;

DBCHARStepResult[STEPNUMLENGTH);

DBCHARGrpNameIGROUPNAMELENGTH);

DBCHARMachineNameIMACHINENAMELENGTN);

DBCHARUserRqst;

DBCHARCurrentStat;

CHAR buff[2501;

CHAR szTextl(60);

CHAR szText2I607;

ULONGulNetConnect;

P61DSTRUCT pudStruct;

snitch (msg) case NM CONTROL: /*____________________________________________________*/
usNotifyCode = (USHORT) SHORT2FROMMP(mpt);
if (usNotifyCode == LN_SELECT) snitch (SHORT1FROMMP(mp1)) /*
* If an item on the list is selected, update the text * that shows the next step to be executed.
*/
case DID_RESUME_ADSL1ST: /*------------------------------------*/
if (GetSelectedltemString(hwnd, DID_RESUME ADSLIST, StepNum, STEPNUMLENGTH, TRUE) < 0) return(0);
WinSetDlgItemText(hwnd, DID RESUME NEXTSTEP, StepNum);
break;
/* switch */
/* if */
break;
case IaM_COMMAND: /*______________-_____________________________________*/
switch (COMMANDMSG(8msg)->cmd) C
case DID_OK: /*____________-______________________________________*/
case DID_RESUME_STEP. /*__________________________________________*/
WinSetPointer(HHND DESKTOP, HinGuerySysPointer(HWND DESKTOP, SPTR WAIT, TRUE));
if (SHORT1FROMMR(WinSer>dDlgItemMsg(hWnd, DID RESUME ANYINGROUP, BM_GUERYCHECK, OL, OL ))) WinLoadString(hab, (HMODULE)NULL, IDS BLANK, sizeof(MachineName), MachineName);
else WinGueryDlgItemText(hwnd, DID RESUME MACHINE, ~ ~ ~~ "f~ '~~ '~
._ _.i' d MACH1NENAMELENGTH, MachineName);
uinLoadString(hab) (HMODULE)NULL, IDS ANY, sizeof(szText1), szTextl);
if (strcmp(MachineName, szText1) _= 0) WinLoadString(hab, (HMODULE)NULL, IDS_BLANK, sizeof(MachineName), MachineName);
/* else */
/*
* If there is not a selected item on the list then we assume * that the job has been completed and that the user does not * wish to reexecute a step. The next job step is set to one * beyond the last executed which Will cause the reschedules * to handle the job.
*/
if (NinSencDlgItemMsg(hwnd, DID_RESUME_ADSLIST) LM_OUERYSELECTION, (MPARAM)LIT FIRST, (MPARAM)OL) __ (MRESULT)LIT NONE) C
WinOueryDlgItemText(hund, DID_RESUME_STEPOUT, STEPNUMLENGTH, StepNum);
sprintf(StepNum, "%d", atoi(StepNum) + 1);
/* if */
else WinGueryDlgItemText(hWnd, DID_RESUME_NEXTSTEP, STEPNUMLENGTH, StepNum);
/*
* if OK button uas pressed, update the job record, clearing * the UserRqst field to allow it to resume. The machine * name and current step number are also set.
*/
if (COMMANDMSG(8ansg)->cmd == DID_OK) safe_dbfcmd(dbproc, " UPDATE SSPendingJobTable"
" SET"
" UserRqst = \" \","
" MachineName = \"Xs\","
" StepNum = Xd,"
" StepResult = 0 Xs") MachineName, atoi(StepNum) - 1, qualptr);
/* if */
/*
* E(se the SINGLE STEP button uas pressed, update the job record, * setting the user_resquest field to (S)tep.
*/
else C
safe_dbfcmd(dbproc, " UPDATE SSPendingJobTable"
" SET"
" UserRqst = \"S\","
" MachineName = \"Xs\","
" StepNum = Xd,"
StepResult = 0 Xs", MachineName, atoi(StepNum) - 1, qualptr);
/* else */
dbfreequal(qualptr);
if ((dbsqlexec(dbproc) _= FAIL) ;; (dbresults(dbproc) _= FAIL)) DosBeep( 400, 50 >;
WinLoadString(hab, (HMOOULE)NULL, IDS_1TEM_BUSY, sizeof(szTextl), (PSZ)szTextl);

~~ ~~.11 ~

Ninl.oadString(hab, (HMODULE)NULL, IDS WARNING, sizeof(szText2), (PSZ)szText2);
NinMessageBox(HNND DESKTOP, hwnd, szTextl, szText2, 0, MB OK ; MB WARNING ; MB MOVEABLE);
/* i f while (dbresults(dbproc) != NO MORE RESULTS) dbcanquery(dbproc);
NinDismissDlg(hwnd, TRUE);
/* Ask the server to examine the runnable list */
if (!ADSNetConnect(&ulHetConnect, szServerHame, BATCHD SERVICE)) ADSNetDisconnect(ulNetConnect);
NinSetPointer(HNND DESKTOP, 41in0uerySysPointer(HNND DESKTOP, SPTR ARRON, TRUE));
return(0);
case DID CANCEL: /*_______________________________________________*/
dbfreequal(qualptr);
break;
/* switch */
break;
case HM_INITDLG: /*____________________________________________________*/
/*
* Get password from user if needed.
*/
pudStruct.usPwdType = PND_SCHED;
pwdStruct.pszJobData = (PSZ)mp2;
pudStruct.usDataType = P41D_DATA_JOBID;
if (!(NinDlgBox(HHND DESKTOP, hwnd, (PFN41P)EnterPasswordDlgProc, (HMODULE)NULL, IDD P~IDENTER, (PVOID) &pwdStruct))) /,r --* Oops, the users does not know the password, so return.
*/
DosBeep( 300, 300 );
NinDismissDlg(hwnd, FALSE);
return;
/* if */
uinSetPointer(HNND DESKTOP, NinOuerySysPointer(HMND DESKTOP, SPTR WAIT, TRUE));
/*
* load the colurtn title strings from the resource.
*/
NinLoadString(hab, (HMODULE)NULL, i0S RESUME LIST1 TOP, sizeof(szHeadingTop), (PSZ)szHeadingTop);
NinloadString(hab, (HMODULE)NULL, IDS_RESUME_LIST1_BOT, sizeof(szHeadingBottom), (PSZ)szHeadingBottom);
/* Set column widths to zero */
for (i = 0; i < RESUME COLUMNS; i++) alColNidth(iI == 0;
/* Get the current job status info */
safe_~fcmd(dbproc, " SELECT"
" JobRunID,"
" JobListName,"
" StepNum,"
" StepResult,"
UserRqst,"
" CurrentStat,"
" GrpName,"

" MachineName"
" FROM SSPendingJobTable"
" WHERE JobRunID = %ld "
" FOR browse", atol((PSZ)mp2));
dbsqlexec(dbproc);
dbresults(dbproc);
dbbind(dbproc, 1, NTBSTRINGBINO, (LONG)sizeof(JobRunID), JobRunID);
dbbind(dbproc, 2, NTBSTRINGBIND, (LONG)sizeof(JobListName), JobListName);
dbbind(dbproc, 3, NTBSTRINGBIND, (LONG)sizeof(StepNum), StepNum);
dbbind(dbproc, 4, NTBSTRINGBIND, (LONG)sizeof(StepResult), StepResult);
dbbind(dbproc, 5, CHARB1ND, (DBINT) 1, 8UserRqst);
dbbind(dbproc, 6, CHARBIND, (DBINT) 1, &CurrentStat);
dbbind(dbproc) 7, NTBSTRINGBIND, (LONG)sizeof(GrpName), GrpName);
dbbind(dbproc, 8, NTBSTRINGBIND, (LONG)sizeof(MachineName), MachineName);
if (dbnextrow(dbproc) != NO MORE ROWS) qualptr = dbqual(dbproc, -1, ~'SSPendingJobTable");
/* Set titlebar text */
WinLoadString(hab, (HMODULE)NULL, IDS JOB-ID, sizeof(szTextl), szTextl);
WinLoadString(hab, (HMODULE)NULL, IDS_JOB NAME, sizeof(szText2), szText2);
sprintf(buff, "Xs: Xs - Xs: Xs", szTextl, JobRunID, szText2, JobListName);
WinSetWindoaText(hund, buff);
/* Figure out and display which step is next */
WinSetDlgItemText(hwnd, DID RESUME STEPOUT) StepNum);
iStepNum = atoi(StepNum);
if (iStepNum) WinSetDlgItemText(hwnd, DID_RESUME_RETURNCODE, StepResult);
WinLoadString(hab, (HMOOULE)NULL, IDS_BLANK, sizeof(szText1), szTextl);
if ((strcmp(MachineName, "") _= 0) ;;
(strcmp(MachineName, szTextl) _= 0)) WinLoadString(hab, (HMODULE)NULL, 1DS ANY, sizeof(szTextl), szTextl);
WinSetDlgltemText(hund) DID_RESUME MACHINE, szTextt);
H i nEnab l e11 i ndoWllpda to ( W i nl~l i ndowF romI D ( hwrxJ, DID RESUME ANYINGROUP), FALSE );
3 /* if *~
else llinSetDlgItemText(hwnd, DID RESUME MACHINE, MachineName);
/* i f *~
else C
IIinLoadString(hab, (HMOOULE)NULL, IDS_BLANK, sizeof(szTextl), szTextl>;
WinSetDlgItemText(hwnd, DID_RESUME_RETURNCODE, szTextl);
uinLoadString(hab, (HMODULE)NULL, IDS ANY, sizeof(szTextl), szTextl);
WinSetDlgItemText(hWnd, DID_RESUME_MACHINE) szTextt);
WinEnableWindouUpdate(NiMlindowFromID(hund) DID RESUME ANYINGROUP), FALSE );
iSearchSelect = 0;
/* else */
/* Save the JobListName */
strcpy(buff, JoblistName);
dbcanquery(dbproc);
while (dbresults(dbproc) != NO MORE RESULTS) dbcanquery(dbproc);

y /* Load the list box with the job's steps */
LoadListBox(hwnd, DID RESUME_ADSLIST, (PSZ) JobListName, (PSZ)NULL, 0);
/* Select the next step to execute */
if (iStepNun) sprintf(buff, "\r%d\t", iStepNum);
iSearchSelect = (USHORT) SHORT1FROMMR( WinSencblgItenfilsg(hwnd, DID RESUME_ADSLIST, LM_SEARCHSTRING, MPFROM2SHORT(LSS PREFIX ; LSS CASESENSITIVE, LIT-FIRST), buff)) + 1;
/* i f */
else iSearchSelect = 0;
if (!NinSendDlgItemMsg(hwnd, DID_RESUME ADSLIST) LM SELECTITEM, MPFROMSHORT(iSearchSelect), (MPARAM)TRUE)) WinSetDLgItemText(hwnd, DID RESUME NEXTSTEP, "FINISHED");
/* if */
WinSetPointer(HWND DESKTOP, WinGuerySysPointer(H41ND DESKTOP, SPTR ARROW, TRUE));
return(0);
case b1M_MEASUREITEM: /*________________________________________________*/
switch (SHORT1FROMMP(mp1)) C
case DID_RESUME_ADSLIST: /*------------------------------_------_*/
return (MRFROMLONG(ADSLBMeasure(hwnd, DID_RESUME_ADSLIST, SHORT1FROMMP(mp2), alColWidth, RESUME COLUMNS, DID_RESUME_HEADING, szHeadingTop, szHeadingBottom)));
) /* if */
return(0);
case tdM_DRAWITEM: /*________________________________________-__________*/
switch (SHORT1FROMMP(mp1)) C
case DID_RESUME_ADSLIST: /*--------------------------------------*/
ADSLBDraw(hwnd, DID RESUME_ADSLIST, (POWNERITEM)PVOIDFROMMP(mp2), alColWidth, RESUME_COLUMNS, DID RESUME HEADING, FALSE);
return (MRFROMSHORT(TRUE));
/* switch */
return(0);
/* END SWITCH */
return WinDefDlgProc(hwnd, msg, mpt, mp2);
/* END JobStepDlgProc */
/*****************x******************************x****************************/

/* GetSelectedltemString */
/* */
/* This routine queries the listbox identified by the idlist parameter */
/* and returns the text found in the FIRST column of the selected item. */
/* */
/* If the bStrip flag is set the pszBuffer will be stripped of any mufti- */
/* colum formatting characters that may exist. */
/*****************************************************************************/

SHORT GetSelectedItemString(H41ND hwnd, USHORT idList, PSZ pszBuffer, USHORT us8ufferlength, BOOL bStrip) USHORT iSelection;
PS2 pchar;
/* Get the index of the selected list item */
iSelection = (SHORT) SHORT1FROMMR(HinSendDlgItemMsg(hwnd, idList, ~~.;~a LM QUERYSELECTION, OL, OL));
if (iSelection == LIT NONE) C
return(iSelection);
/* if */
/* Get the text string for item at offset iSelection */
uinSeno~lgIterti~lsg(hwnd, idList, LM_DUERYITEMTEXT, MPFROMZSHORT(iSelection, usBufferLength), MPFROMP(psz8uffer));
/* Terminate the output buffer at the first column break */
pchar = strchr(pszBuffer, '\t');
*pchar = 0;
/* If requested, clean up the string */
if (bStrip) while (pszBufferl0l =_ '\r' ;; pszeuffer(0) __ '\n') strcpy(pszBuffer, pszBuffer + ~):
return(iSelection);
/* GetSelectedItemString */
/*****************************************************************************/

/* LoadListBox */
/* */
/* This popular routine is called to load list boxes and combo boxes with */
/* the results of a SoL select. The tables queried and data returned are */
/* are completely dependent on the id of the control to be loaded. WHERE */
/* clauses can be built to include strings passed in with pszWherel. If */
/* the pszSelect string is provided this routine will attempt select the */
/* list item that matches. usstyle is used to determine which view should */
/* be loaded into the top-level client window listbox. */
/******************************x*****x***************,e************************
/
VOID LoadListBox(HWND hwnd, USHORT idList, PSZ pszHherel, PSZ pszSelect, USHORT usstyle) SHORT iSearchSelect;

DBCHARProgramNametEXECUTENAMELENGTH);

DBCHARFileNameCEXECUTEFILELENGTN7;

DBCHARMachineName(MACH1NENAMELENGTH7;

DBCHARMachineDesc(MACHINEDESCLENGTH1;

DBCHARGrpNamelGROUPNAMELENGTN];

DBCHARJoblistName(JOBNAMELENGTH);

DBCHARJobListDescfJOBDESCLENGTH7;

DBCHARBulltByIJOBEDITBYLENGTH7;

DBCHARJobStepNUm(STEPNUMLENGTH);

DBCNARJobProgramNameISTEPPRGLENGTH);

DBCHARArgListIISTEPARGSLENGTH);

DBCHARJobRunID(JOB1DLENGTH7;

DBCHARUserRqst;

DBCHARCurrentStat;

DBCHARNextRunDate(JOBDATELENGTHI;

DBCHARLastModifiedDateIDATELENGTH);

DBCHARConvertDateIDATELENGTH);

DBCHARLastModifiedTimeITIMELENGTH7;

DBCHARSchedBy(JOBEDITBYLENGTH);

DBCHARPriorityFlag;

CHAR abBufferl25b);

CHAR pszUserRequestll5);

CHAR pszCurStatus(I5);

WinSetPointer(HWND DESKTOP, HinOuerySysPointer(HWND DESKTOP) SPTR WAIT, TRUE));

'~
~-~f a a..

/* Prevent updates to the list (multicolurtn list requirement) */
uinEnableWindouUpdate(HinWindowFromID(hwnd, idList), FALSE);
/* Flush the old data */
HinSendDlgItemMsg(hwnd, idList, LM DELETEALL, 0, 0);
/*********************************************************************
* On the list id build the SOL command buffer and bind to variables *********************************************************************/
switch (idlist) C
/*
* Main top-level status display listbox */
case ID CLIENT ADSLIST: /*--------------------------------------------*/
/* Turn off the listbox heading area update to force a complete paint */
WinEnablellindowUpdate(WinWindowFromID(hwnd, 1D CLIENT HEADING), FALSE);
/* If filter is NULL, set wildcards */
if (strlen(pszFilterJob) <= 0) strcpy(pszFilterJob, "X%");
if (strlen(pszFilterey) <= 0) strcpy(pszFilterBy, "XX");
if (strlen(pszFilterGroup) <= 0) strcpy(pszFilterGroup, "XX");
if (strlen(pszFilterStart) <= 0) strcpy(pszFilterStart, "01/01/50");
if (strlen(pszFilterEnd) <= 0) strcpy(pszFilterEnd, "12/31/49");
/*
* The actual select depends on the current view. Refer to the * stored procedures for the critera.
*/
switch (usStyle) C
case 1DM VIE11DEFAULT: /*-__________________________________-____*/
safe_dbfcmd(dbproc, " SELECT"
" JobRunID,"
" JoblistName,"
" UserRqst,"
" CurrentStat,"
" PriorityFlag,"
" NxtRuroateTime,"
" GrpName,"
" SchedBy"
" FROM SSPendingJobTable"
" WHERE CurrentStat LIKE \"CEGRTW7\""
and UserRqst not LIKE \"CC7\""
" and JobListName LIKE \"Xs\""
" and SchedBy LIKE \"Xs\""
" and GrpName LIKE \"Xs\""
and NxtRunDateTime >= convert(datetime, \"Xs 12:OOam\")"
" and NxtRunDateTime <= convert(datetime, \"Xs 11:59pm\")"
" ORDER BY PriorityFlag, NxtRuroateTime, JobRunID", pszFilterJob, pszFilterBy, pszFilterGroup, pszFilterStart, pszFilterErxl);
dbsqlexec(dbproc);

rd Ct . .i id dbresults(dbproc);
dbbind(dbproc, 1, NTBSTRINGBIND, (LONG)sizeof(JobRunID), JobRunID);
dbbind(dbproc, 2, NTBSTRINGBIND, (LONG)sizeof(JobListName), JobListName);
dbbind(dbproc, 3, CHARBIND) (DBINT) 1, &UserRqst);
dbbind(dbproc, 4, CHARBIND, (DBINT) 1) BCurrentStat);
dbbind(dbproc, 5, CHARBIND) (DBINT) 1, (BYTE *) BPriorityFlag);
dbbind(dbproc, b, NTBSTRINGBIND, (LONG)sizeof(NextRunDate), NextRuroate);
dbbind(dbproc, 7, NTBSTRINGBIND, (LONG)sizeof(GrpName), GrpName);
dbbind(dbproc, 8, NTBSTRINGBIND, (LONG)sizeof(SchedBy), SchedBy);
break;
case IDM VIE41HISTORY: /*--------------_---------------------_---*/
safe_dbfcmd(dbproc, " SELECT"
" JobRunID,"
" JobListName,"
" UserRqst,"
" CurrentStat,"
" PriorityFlag,"
NxtRunDateTime,"
" GrpName,°
" SchedBy"
" FROM SSPendingJobTable"
" WHERE (CurrentStat LIKE \"LSE)\""
OR UserRqst LIKE \"fC)\")"
" AND JobListName LIKE \"Xs\""
" AND SchedBy LIKE \"Xs\""
" AND GrpName LIKE \"Xs\""
" AND NxtRunDateTime >= convert(datetime, \"Xs\")"
AND NxtRunDateTime <= convert(datetime, \"Xs\")"
" ORDER BY JobRunlD", pszFilterJob, pszFilterBy, pszFilterGroup, pszFilterStart, pszFilterEnd);
dbsqlexec(dbproc);
dbresults(dbproc);
dbbind(dbproc, 1, NTBSTRINGBIND, (LONG)sizeof(JobRunID), JobRunID);
dbbind(dbproc, 2, NTBSTRINGBIND, (LONG)sizeof(JobListName), JobListName);
dbbind(dbproc, 3, CHARBIND, (DBINT) 1, &UserRqst);
dbbind(dbproc, 4, CHARBIND, (DBINT) 1, BCurrentStat);
dbbind(dbproc, 5, CHARBIND, (DBINT) 1, (BYTE *) BPriorityFlag);
dbbind(dbproc, 6, NTBSTRINGBIND, (LONG)sizeof(NextRuroate), NextRunDate);
dbbind(dbproc, 7, NTBSTRINGBIND, (LONG)sizeof(GrpName), GrpName);
dbbind(dbproc, 8, NTBSTRINGBIND, (LONG)sizeof(SchedBy), SchedBy);
break;
case IDM_VIEWALL: /*____________________________________________*/
safe_dbfcmd(dbproc, " SELECT"
JobRunID,"
" JobListName,"
" UserRqst,"
" CurrentStat,"
" PriorityFlag,"
" NxtRunDateTime,"
" GrpName,"
SchedBy"
" FROM SSPendingJobTable"
" WHERE JobListName LIKE \"Xs\""
" AND SchedBy LIKE \"Xs\""

~. ~ '~ ~. ~ ~~

" AND GrpName LIKE \"%s\""
" AND NxtRunDateTime >= convert(datetime, \"%s\")"
" AND NxtRunDateTime <= convert(datetime, \"%s\")"
" ORDER BY JobRunID", pszFilterJob, pszFilterBy, pszFilterGroup, pszFilterStart, pszFilterEnd);
dbsqlexec(dbproc);
dbresults(dbproc);
dbbind(dbproc, 1, NTBSTRINGBIND, (LONG)sizeof(JobRunID), JobRunID);
dbbind(dbproc, 2, NTBSTRINGBIND, (LONG)sizeof(JobListName), JoblistName);
dbbind(dbproc, 3, CHARBIND, (DBINT) 1, BUserRqst);
dbbind(dbproc, 4, CHARB1ND, (DBINT) 1, &CurrentStat);
dbbind(dbproc, 5, CHARBIND, (DBINT) 1, (BYTE *) &PriorityFlag);
dbbind(dbproc, 6, NTBSTRINGBIND, (LONG)sizeof(NextRunDate), NextRunDate);
dbbind(dbproc, 7, NTBSTRINGBIND, (LONG)sizeof(GrpName), GrpName);
dbbind(dbproc, 8, NTBSTRINGBIND, (LONG)sizeof(SchedBy), SchedBy);
break;
J /* switch */
/* Restore those NULLs */
if (strcmp(pszFilterJob, "XX") _= 0) strcpy(pszFilterJob, "");
if (strcmp(pszFilterBy, "XX") _= 0) strcpy(pszFilterBy, "");
if (strcmp(pszFilterGroup, "%%") _= 0) strcpy(pszFilterGroup, "");
if (strcmp(pszFilterStart, "1/1/1900 12:OOam") _= 0) strcpy(pszFilterStart, "");
if (strcmp(pszFilterEnd) "12/31/3000 11:59pm") _= 0) strcpy(pszFilterEnd, "");
break;
/*
* ExecuteDlgProc Listbox */
case DID_EXECUTE ADSLIST: /*__________________________________________*/
dbcmd( ~proc, _ " SELECT"
" programName,"
AvailProgramFileName"
" FROM SSAvailProgramTable"
" ORDER BY ProgramName");
dbsqtexec(~proc);
dbresults(dbproc);
dbbind(dbproc, 1, NTBSTRINGBIND, (LONG)sizeof(ProgramName), ProgramName);
dbbind(dbproe, 2, NTBSTRINGBIND, (LDNG)sizeof(FileName), FileName);
break;
/*
* JobListDlgProc Listbox */
case DID_JOBLIST_ADSLIST: /*__________________________________________*/
dbcmd(dbproc, " SELECT"

~~ ~~~ ~;7 " JobListName,"
" BuiltBy,"
" convert(char(11), LastMod, 1),"
convert(char(9), LastMod, 8>,"
" JobListDescr"
" FROM SSJobListTable"
" ORDER BY JobListName");
dbsqlexec(dbproc);
dbresults(dbproc);
dbbind(dbproc, 1, NTBSTRINGB1ND, (LONG)sizeof(JobListName), JobListName);
dbbind(dbproc, 2, NTBSTRINGBINO, (LONG)sizeof(BuiltBy), BuiltBy);
dbbind(dbproc, 3, NTBSTRINGBIND, (LONG)sizeof(LastModifiedDate), LastModifiedDate);
dbbind(dbproc, 4, NTBSTRINGBIND, (LONG)sizeof(LastModifiedTime), LastModifiedTime);
dbbind(dbproc, 5, NTBSTRINGBIND, (LONG)sizeof(JobListDesc)) JobListDesc);
break;
/*
* JobStepDlgProc Listbox */
case DID_JOBSTEP_ADSLIST: /*------------------------------------------*/
safe_dbfcmd(dbproc, " SELECT"
" JobStepNum,"
" ProgramName,"
" ArgumentListl,"
" ArgumentList2"
" FROM SSJobStepTable"
" NHERE JobListName LIKE \"Xs\""
" ORDER BY JobStepNun", pszWherel);
dbsqlexec(dbproc);
dbresults(dbproc);
dbbind(dbproc, 1, NTBSTRINGBIND, (LONG)sizeof(JobStepNum), JobStepNum);
dbbind(dbproc, 2, NTBSTRINGBIND, (LONG)sizeof(JobProgramName), JobProgramName);
dbbind(dbproc, 3, NTBSTRINGBiND, (LONG)sizeof(ArgList1), ~ArgListl);
i f (pszllherel ) WinLoadString(hab, (HMODULE)NULL, IDS JOB STEPS, sizeof(abBuffer), abBuffer);
sprintf(abeuffer, "Xs: Xs", abeuffer, pszWherel);
/* if */
else WinLoadString(hab, (HMODULE)NULL, IDS_NO_JOB, sizeof(abeuffer), abeuffer);
break;
/*
* ,lobStepDlgProc Program Name Combo Box */
case DID JOBSTEP COHBO: /*____________________________________________*/
dbcmd(dbproc, " SELECT"
" ProgramName,"
" AvailProgramFileName"
" FROM SSAvailProgramTable"
" ORDER BY ProgramName");

-1~~-dbsqlexec(dbproc>;
dbresults(dbproc>;
dbbind(dbproc) 1, NTBSTRINGBIND, (LONG)sizeof(JobProgramName), JobProgramName);
break;
/*
* DayTimerDlgProc Job List Combo Box */
case DID_DAYTIMER JOBCOMBO: /*----------------------------------------*/
dbcmd(dbproc, " SELECT"
" JobListName,"
" Joblist0escr"
" FROM SSJobListTable"
" ORDER BY JobListName");
dbsqlexec(dbproc);
dbresults(dbproc);
dbbind(dbproc, 1, NTBSTRINGBIND, (LONG)sizeof(JobListName), JobListName);
break;
/*
* DayTimerDlgProc Group name Combo box */
case DID DAYTIMER GRPCOMBO: /*----------------------------------------*/
dbcmd(dbproc, " SELECT"
" GrpName,"
" GrpDescr"
" FROM SSGrpTable"
" ORDER BY GrpName");
dbsqlexec(dbproc);
dbresults(dbproc);
dbbind(dbproc, 1, NTBSTRINGBIND, (LONG)sizeof(GrpName), GrpName);
break;
/*
* ResumeDlgProc List box */
case DID_RESUME_ADSLIST: /*-------------------------------------------*/
safe_dbfcmd(dbproc, " SELECT"
" JobStepNum,"
" ProgramName,"
" ArgumentListl,"
" ArgumentList2"
" FROM SSJobStepTable"
" WHERE JobListName LIKE \"Xs\""
" ORDER BY JobStepNum", pszwherel);
dbsqlexec(dbproc);
dbresults(dbproc);
dbbind(dbproc, 1, NTBSTRINGBIND, (LONG)sizeof(JobStepNum), JobStepNum);
dbbind(dbproc, 2, NTBSTRINGBIND, (LONG)sizeof(JobProgramName), JobProgramName);
dbbind(dbproc, 3, NTBSTRINGBIND, (LONG)sizeof(ArgListl)) ArgListt);
break;
/*

Y;~ .A ~
* FilterDlgProc Job Combo Box */
case DID FILTER JOBCOMBO: /*__________________________________________*/
dbcmd(dbproc, " SELECT"
" distinct JobListName"
" FROM SSPendingJobTable"
" ORDER BY JobListName");
dbsqlexec(dbproc);
dbresults(dbproc);
dbbind(dbproc, 1, NTBSTRINGBIND, (LONG)sizeof(JobListName), JobListName);
break;
/*
* FilterOlgProc Scheduled By Combo Box */
case DID FILTER BYCOMBO: /*________________________-__________________*/
dbcmd(dbproc, " SELECT"
" distinct SchedBy"
" FROM SSPendingJobTable"
" ORDER BY SchedBy");
dbsqlexec(dbproc);
dbresults(dbproc>;
dbbind(dbproc, 1, NTBSTRINGBIND, (LONG)sizeof(SchedBy), SchedBy);
break;
/*
* FilterDlgProc Group Combo Box */
case DID FILTER GROUPCOMBO: /*----------------------------------------*/
dbcmd(dbproc, " SELECT"
" distinct GrpName"
" FROM SSPendingJobTable"
" ORDER BY GrpName");
dbsqlexec(dbproc);
dbresults(dbproc);
dbbind(dbproc, 1, NTBSTRINGBIND) (LONG)sizeof(GrpName), GrpName);
break;
/*
* PickServerDlgProc Listbox #1 */
case DID_PICKSERY_ADSLIST: /*-----------------------------------------*/
dbcmd(dbproc, " SELECT"
MachineName,"
" MachineDescr,"
" MaxJobs"
" FROM SSMachineTable"
" ORDER BY MachineName");
dbsqlexec(dbproc);
dbresults(dbproc);
dbbind(dbproc, 1, NTBSTRINGBIND, (LONG)sizeof(MachineName)) MachineName);
dbbind(dbproc, 2, NTBSTRINGBIND, (LONG)sizeof(MachineDesc), MachineDesc);
break;

n~~ ~~~ ~~
pi .;1. CJ ,:e.. il default:
WinSetPointer(HWND_DESKTOP, NinOuerySysPointer(HNND DESKTOP, SPTR ARR041, TRUE));
return;
/* switch */
/***************************************x******************
* Loop through returned rows...
* Building the strings to insert into the list control.
* Inserting the string into the list.
**********************************************************/
if (dbnextrow(dbproc) != NO MORE RONS) do C
/*
* Switch on the listbox id */
switch (idList) C
/*
* Top level list box */
case ID_CL1ENT_ADSLIST: /*----------------------------------------*/
switch (usStyte) C
case IDM_VIEbIDEFAULT: /*-----------------------------------*/
case IDM_VIEwHISTORY: /*___________________________________*/
case IDM VIEWALL: /*_______________________________________*/
/*
* Build printable strings for status flags.
*/
if ((SHORT)PriorityFlag =_ '1') WinLoadString(hab, (HMODULE)NULL, IOS_RUSH, sizeof(NextRunDate), NextRunDate);
else if ((SHORT)PriorityFlag =_ '2') WinLoadString(hab, (HMODULE)NULL, IDS_ASAP, sizeof(NextRuroate), NextRunDate);
switch (UserRqst) C
case ' '. /*_________________________________________*/
IIinLoadString(hab, (HMODULE)NULL, IDS_BLANK, sizeof(pszUserRequest), pszUserRequest);
break;
case 'H'~ /*-________________________________________*/
WinLoadString(hab, (HMODULE)NULL, IDS HOLD, sizeof(pszUserRequest), pszUserRequest);
break;
case 'S'~ /*_________________________________________*/
NinLoadString(hab, (HMODULE)NULL, IDS STEP, sizeof(pszUserRequest), pszUserRequest);
break;
case 'C'~ /*-________________________________________*/
SIinLoadString(hab) (HMODULE)NULL, IDS CANCEL, sizeof(pszUserRequest), pszUserRequest>;
break;
/* switch */
switch (CurrentStat) C
case 'E'~ /*-________________________________________*/
WinLoadString(hab, (HMODULE)NULL, IDS_ERROR, sizeof(pszCurStatus), pszCurStatus);
break;
case 'G'~ /*-________________________________________*/
WinLoadString(hab, (HMODULE)NULL) IDS_GROUP_BUSY, sizeof(pszCurStatus), pszCurStatus);
break;
case ~R~~ /*_________________________________________*/
WinLoadString(hab, (HMODULE)NULL, IDS RUNNING, sizeof(pszCurStatus), pszCurStatus);
break;
case 'S': /*-________________________________________*/
WinLoadString(hab, (HMODULE)NULL, IDS_SUCCESS, sizeof(pszCurstatus), pszCurstatus);
break;
case 'T'~ /*-________________________________________*/
NinLoadString(hab, (HMODULE)NULL, IDS_ATTEMPTING, sizeof(pszCurStatus), pszCurStatus);
break;
case 'W'~ /*-____________________________-___________*/
uinLoadString(hab, (HMODULE)NULL, IDS_WAITING, sizeof(pszCurStatus), pszCurStatus);
break;
/* switch */
sprintf(abBuffer, "\r%s\t%s\t%s\t%s\t%s\t%s\tXs", JobRunID, JoblistName, pszUserRequest, pszCurStatus, NextRuroate, GrpName, Sched8y);

break;

/* snitch */

WinEnableWindowUpdate(WinWindowFromID(hwnd,, ID CLIENT HEADING) TRUE);

break;

case DID_EXECUTE_ADSLIST: /*-------------------------------------*/

sprintf(abeuffer, "%s\tXs", Prograrttlame, FileName);

break;

case DID PICKSERV ADSLIST: /*------------------------------------*/

sprintf(abeuffer, "%s\tXs", MachineName) MachineDesc);

break;

case DID_JOBLIST_ADSLIST: /*-------------------------------------*/

ADSConvertDateFromMDY(pUserAttr->szDateFmtCode, ConvertDate, LastModifiedDate);

sprintf(abeuffer, "Xs\tYs\tXs\t%s %s", JobListName) JobListDesc, BuiltBy, ConvertDate, LastModifiedTime);

break;

case O1D JOBSTEP ADSLIST: /*-------------------------------------*/

sprintf(abeuffer, "\r%s\tXs\tXs", JobStepNum, JobProgramName, ArgListl);

break;

case DID_JOBSTEP COMBO: /*_______________________________________*/

sprintf(abBuffer, "Xs", JobProgramName);

break;

case DID_DAYTIMER_J08COM80: /*-----------------------------------*/

sprintf(ab8uffer, "Xs", JobListName);

break;

case DID_DAYT1MER_GRPCOMBO: /*-----------------------------------*/

sprintf(abeuffer, "9a", GrpName);

break;

case DID_RESUME_ADSLIST: /*--------------------------------------*/

sprintf(abBuffer, "\rXs\tXs\tXs", JobStepNum, JobProgramName, ArgListt);

break;

case DID FILTER JOBCOMBO: /*-------------------------------------*/

sprintf(abBuffer, "Xs") JobListName);

c~ ,~
~, f: .::.

break;
case DID_FILTER BYCOMBO: /*--------------------------------------*/
sprintf(abeuffer, "%s", SchedBy>;
break;
case D1D FILTER GROUPCOMBO: /*___________________-____-_______-__*/
sprintf(abeuffer, "%s", GrpName);
break;
default:
NinSetPointer(H41ND_DESKTOP, 4linGuerySysPointer(HNND DESKTOP, SPTR ARROW, TRUE));
return;
) /* switch */
uinSendDlgItertMsg(hwnd, idList, LM_INSERTITEM, MPFROMSHORT(LIT END), MPFROMP(abBuffer));
while (dbnextrow(dbproc) != NO MORE ROHS);
else /*
* Else, there are no items in the database table so insert a * blank line to allow the headings to display.
*/
sprintf(abBuffer, " ");
WinSer>dDlgItemMsg(hwnd, idList, LM_INSERTITEM, MPFROMSHORT(LIT_END), MPFROMP(abBuffer));
NinSer>dDlgItemMsg(hWnd, idList, LM DELETEALL, 0, 0);
/* else *%
dbcanquery(dbproc);
while (dbresults(dbproc) != NO MORE RESULTS) dbcanquery(dbproc);
/* If this is the main list) be sure to turn the heading back on. */
if (idList == ID_CLIENT_ADSLIST) WinEnableWindowUpdate(WiMlindoNFromID(hwnd, ID CLIENT HEADING), TRUE);
/*
* Try to select the item that matches the pszSelect string.
*/
if (pszSelect != NULL) iSearchSelect = (USHORT) SHORT1FROMMR( WinSer>dDlgItemMsg(hwnd, idList, LM_SEARCHSTRING, MPFROM2SHORT(LSS PREFIX ; LSS CASESENSIT111E, LIT_FIRST), pszSelect));
WinSend4lgItemMsg(hsmd, idList, LM_SELECTITEM, MPFROMSHORT(iSearchSelect), (MPARAM)TRUE);
/* if */
WinShosrHindow(WinHindoNFromID(hNnd, idlist), TRUE);
WinSetPointer(HWND DESKTOP, WinGuerySysPointer(HWND DESKTOP, SPTR AKRON, TRUE));
return;
/* LoadListBox */
/***********x*******************x**************x*****x************************/

/* SetPushButtons */
/* */
/* Loops through the buttons in array pointed to by usPushButtons, setting */
/* the default flag in the button identified by idDefault and clearing the */

/* flags on the remaining buttons in the array. */
/*****************************************************************************/

VOID SetPushButtons(HNND hwnd, USHORT usNumButtons, USHORT idDefault, USHORT *usPushButtons) USHORT i;
for (i = 0; i < usNumeuttons; i++) NinSendDlgItemMsg(hwnd, *(usPushButtons + i), BM_SETDEFAULT, (MPARAM)(idDefault =_ *(usPushButtans + i)), (MPARAM) OL);
J /* SetPushButtons */
/********************************x********************************************/

/* SetUserRequest */
/* */
/* This routine sets the UserRqst field of a Job. If the UserRqst */
/* is a CANCEL, it may request verification. This type of a change to a job */
/* is considered a change to the job schedule so a password will be required */
/* if it is set. The actually deletion of items from the SSPendingJobTable */
/* is handled by the SSBatchTrigger when the UserRqst changes to 'C' */
/*****************************************************************************/

VOID SetUserRequest(HWND hwnd, PSZ pszJobID, CHAR cUserRequest)C
PSZ qualptr;
DBCHAR UserRqst;
DBCHAR CurrentStat;
DBCHAR JobRunID[JOBIDLENGTH];
CHAR bufferf80);
CHAR szText1L80);
CHAR szText2I807;
PIdDSTRUCT pwdStruct;
WinSetPointer(HWND DESKTOP) Wir~uerySysPointer(HWNO DESKTOP, SPTR SIAIT, TRUE));
/*
* Build the SOL Command buffer and execute. We want to be aware of the * CurrentStat and the existing UserRqst. This is a 'for browse' -* we will not change any Job that is modified after this select.
*/
safe_dbfcmd(dbproc, " SELECT"
" JobRunID,"
" UserRqst,"
" CurrentStat"
" FROM SSPendingJobTable"
" WHERE JobRunlO = Xld"
" FOR browse", atol(pszJobID));
dbsqlexec(dbproc);
dbresults(dbproc);
dbbind(dbproc, 1, NTBSTRINGBIND, (LONG)sizeof(JobRunID), JobRunID);
dbbind(o'bproc, 2, CHARBIND, (DBINT) 1, &UserRqst);
dbbind(~proc, 3, CHARBIND, (DBINT) 1, 8CurrentStat);
if (dbnextrow(dbproc) != NO MORE RONS) qualptr = dbqual(dbproc, -1, "SSPendingJobTable");
dbcanquery(dbproc);
while (dbresults(dbproc) != NO MORE RESULTS) dbcanquery(dbproc);
/*
* Get the scheduling password from user if needed.
*/
pudStruct.usPwdType = PIID SCHED;

nit ~ c_.f d pudStruct.pszJobData = pszJobID;
pwdStruct.usDataType = PND_DATA_JOBID;
if (!(WinDlgBox(HWND DESKTOP, hwnd, (PFNWP)EnterPasswordDlgProc, (HMODULE)NULL, IDD PWDENTER, (PVOID) &pwdStruct))) C
/*
* Oops, the user does not know the password, so return.
*/
DosBeep( 300, 300 );
LlinSetPointer(HWND DESKTOP, WinOuerySysPointer(H41ND DESKTOP, SPTR ARROW, TRUE));
return;
/* if */
/*
* Ne have decided to not verify deletes of successfully completed * jobs. If the job is password protected the user would have been * queried for the password or he is the admin.
*/
if (cUserRequest =_ 'C' 8& !(CurrentStat =_ 'S')) C
DosBeep( 400, 50 );
if (CurrentStat =_ 'R') C
WinLoadString(hab, (HMODULE)NULL, IDS_JOB, sizeof(szTextl), szTextt);
WinLoadString(hab, (HMODULE)NULL, IDS_ERASE RUN, sizeof(szText2), szText2);
sprintf(buffer, "Xs Xs Xs", szTextl, pszJobID, szText2);
/* if */
else C
WinLoadString(hab, (HMODULE)NULL, IDS ERASE-JOB, sizeof(szTextl), szTextl);
sprintf(buffer, "XsXs", szTextl, pszJobID);
/* else */
SJinLoadString(hab, (HMODULE)NULL) IDS ERASE, sizeof(szTextl), szTextl);
if (MBID CANCEL == 41iM1essage8ox( HWND_DESKTOP, hwnd, buffer, szTextl, 0, MB_OKCANCEL ~ MB QUERY i MB DEFBUTTON1 ; MB MOVEABLE)) C
dbfreequal(qualptr);
4linSetPointer(HWND DESKTOP, WinOuerySysPointer(HNND DESKTOP, SPTR ARROL1, TRUE));
return;
/* if */
3 /* i f */
WinSetPointer(HWND_DESKTOP, WinOuerySysPointer(HHND DESKTOP, SPTR WAIT, TRUE));
/*
* Build the SGL command buffer to do the update. Don't update * the job if it has been touched since we last looked.
*/
UserRqst = cUserRequest;
safe_dbfcmd(~proc, " UPDATE SSPendingJobTable"
" SET UserRqst = \"%c\" %s", UserRqst, qualptr);
dbfreequal(qualptr);
if ((dbsqlexec(dbproc) _= FAIL) ;; (dbresults(dbproc) _= FAIL)) C
DosBeep( 400, 50 );
UinLoadString(hab, (HMOOULE)NULL, iDS ITEM BUSY, sizeof(szTextl), <PSZ)szTextl>;
LIinLoadString(hab, (HMOOULE)NULL, IDS_WARNING, sizeof(szText2), (PSZ)szText2);
WiMlessage8ox(HWND DESKTOP, hwnd, szTextl, szText2, 0, MB OK ; MB WARNING ; MB MOVEABLE);

~~~~~~

/* if */
WinSend~lsg(hwnd, WM_TIMER, MPFROMSHORT(TID CLIENT REFRESH), OL);
dbcanquery(dbproc>;
while (dbresults(dbproc) != NO MORE RESULTS) dbcanquery(dbproc);
/* if */
WinSetPointer(HWND_DESKTOP, WinGuerySysPointer(HWND DESKTOP, SPTR ARROW, TRUE));
/* SetUserRequest *~
/************x************x***************************************************/

/* RushJob */
/* */
/* RushJob accepts a JobID for a scheduled and waiting job and changes its */
/* run priority to a 1. A Rushed Job will run immediately rather than at */
/* its scheduled date and time. The user will be queried for a password if */
/* a scheduling password has been set for the job. After completion the */
/* Rushed Job will be rescheduled as it normally would have been. */
/* */
/*****************************************************************************/

VOID RushJob(HWND hwnd, PSZ pszJobID) C
ULONG ulNetConnect;
PSZ qualptr;
DBCHAR CurrentStat;
PWDSTRUCT pwdStruct;
CHAR szText1I807;
CHAR szText2(807;
/*
* Get the scheduling password from the user if it is needed.
*/
pwdStruct.usPwdType = PWD_SCHED;
pwdStruct.pszJobData = pszJobID;
pwdStruct.usDataType = PWD_DATA_JOBID;
if (!(WinDlgBox(HWND DESKTOP, hwnd, (PFNWP)EnterPasswordDlgProc, (HMODULE)NULL, IDD PWDENTER) (PVOID) &pwdStruct))) /' * Oops, the user does not know the password, so return.
*/
DosBeep( 300, 300 );
return;
/* if */
WinSetPointer(HWND DESKTOP, WinGuerySysPointer(HWND DESKTOP, SPTR WAIT, TRUE));
/*
* To Rush a Job the PriorityFlag is set to t. Use the 'for browse' * clause to insure that the job is not updated elsewhere before * we date it here.
*/
safe_c&~fcmd(dbproc, " SELECT"
CurrentStat"
" FROM SSPendingJobTable"
" WHERE JobRunID = Xld"
" FOR browse", atol(pszJobID));
dbsqlexec(dbproc);
dbresults(dbproc);
dbbind(dbproc, 1, CHARBIND, (DBINT) 1, BCurrentStat);
/*
* To RUSH, the job MUST be Waiting a ~~~il~_~~

*/
if ((dbnextrow(dbproc) != NO MORE ROWS) && (CurrentStat =_ ~H~)) C
qualptr = dbqual(dbproc, -1, "SSPendingJobTable">;
dbcanquery(dbproc);
while (dbresults(dbproc) != NO MORE RESULTS) dbcanquery(dbproc);
safe dbfcmd(dbproc, UPDATE SSPendingJobTable"
" SET PriorityFlag = \"1\" %s", qualptr);
dbfreequal(qualptr);
if ((dbsqlexec(dbproc) _= FAIL) ;; (dbresults(dbproc) _= FAIL)) C
DosBeep( 400, 50 );
HinLoadString(hab, (HMODULE)NULL, IDS_ITEM_BUSY, sizeof(szTextt), (PSZ)szTextl);
WinLoadString(hab, (HMODULE)NULL, IDS_WARNING, sizeof(szText2), (PSZ)szText2);
WiMlessageBox(HHND DESKTOP, hwnd, szTextl, szText2, 0, MB OK ; MB WARNING ; MB MOVEABLE);
/* if else /*
* Since this is a rush, get the server to examine its runnable list.
*/
if (!ADSNetConnect(&ulNetConnect, szServerName, BATCHD SERVICE)) ADSNetDisconnect(ulNetConnect);
dbcanquery(dbproc);
while (dbresults(dbproc) != NO MORE RESULTS) dbcanquery(dbproc);
/* if */
else C
dbcanquery(dbproc);
while (dbresults(dbproc) != NO MORE RESULTS) dbcanquery(dbproc);
WinSetPointer(H11ND_DESKTOP, Nir>DuerySysPointer(HHND DESKTOP, SPTR ARR011, TRUE));
) /* RushJob *~
/**************************x*x*******************************************
* Function: SetJobStepOptions * Description: Set buttons as enabled or disabled depending on list * box and combo box selections.
* Returns: nothing *
************************************x***********************************/
VOID SetJobStepOptions(HWND hwnd) C
LONG sListBoxSel;
USHORT sComboBoxSel;
sListBoxSel = (LONG)WinSendwlsg(Win6lindowFromID(hwnd, D1D JOBSTEP ADSLIST), LM_DUERYSELECTION, OL, OL);
sComboBoxSel = HinaueryDlgItemTextLength(hwnd, DID JOBSTEP COMBO);
WinEnablewindow(41in11indowFromID(hwnd, DID_JOBSTEP APPEND), sComboBoxSel != 0);

r 9 ~' ~ ~r~ ~1 Kl _~= ~.i _.~.. ~..%

uinEnableWindow(WinuindowFromID(hwnd, DID-JOBSTEP-INSERT)) sListBoxSel != LIT_NONE);
uinEnableWindow(winWindowFromID(hwnd, DID JOBSTEP UPDATE), sListBoxSel != LIT_NONE);
uinEnablellindow(WinNindowFromID(hwnd, DID JOBSTEP DELETE), sListBoxSel != LIT NONE);
return;
static char szRevisionl) _ "$Revision: 4.4 S BATCH03.C":
/************************************************************************
* Copyright (c) 1990, 1991, 1992, 1993 American Airlines * File: BATCHO1.C
* System: Batch Administration * Description: The Batch Administration program provides a user * interface to Batch Scheduler, allowing users to build, * submit, and query batches.
* This module contains DayTimerDlgProc, which controls * the dialog box used to schedule and reschedule batches.
************************************************************************/
#define DBMSOS2 #define INCL_PM
#define EXTERN extern #include <os2.h>

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

#include <stdarg.h>

#include <ctype.h>

#include "sqlfront.h"

#include "sqldb.h"

#include "adslen.h"

#include "ads. h"

#include "adsnet.h"

#include "dialog. h"

#include "batchdef.h"

#include "batchdlg.h"

#include "batch. h"

/**************r**************************************************************/

/* */

/* DayTimerDlgProc */

/* */

/* This routine displays, controls, and extracts*/
data from a dialog box /* that allows the user to schedule or reschedule*/
a batch job.

/* */

/* Information from this dialog box is placed*/
in the SSPending,lobTable.

/* */

/* Rescheduled jobs are not accomplished with*/
a SaL update - instead they /' are reinserted as a new job and then the */
old one is deleted.

/* */

/*****************************************************************************/

MRESULT EXPENTRY DayTimerDlgProc(HWND hwnd, mp2) USHORT msg, MPARAM mpl, MPARAM

USHORT usNotifyCode;

USHORT i;

USHORT usNun;

ULONG ulData;

ULONG ulNetConnect;

MRESULT mresult;

SHORT sNumChars;

CHAR Buffer[801;

BOOL flag;

DBCHAR JobListName[JOBNAMELENGTH1;

DBCHAR GrpName[GROUPNAMELENGTH1;

DBCHAR UserRqst;

DBCHAR CurrentStat;

DBCHAR PriorityFlag;

DBTINYINT RecurHeekday =
0;

DBSMALLINTRecurMonthday =
0;

DBSMALLINTRecurMonth = 0;

DBSMALLINTRecurPrd = 0;

DBINT JobRunID;

USHORT start_hour;

USHORT start_min;

DBCNAR NextRunDate[JOBDATELENGTH1;

OBCHAR ConvertDate[JOBDATELENGTH1;

PblDSTRUCTpudStruct;

CHAR szText1I1201;

CHAR szlext2[1201;

BOOL bresult;

CHAR DisplayTime[41;

static hpointerIcon;
HPOINTER

static old_UserRequest;
DBCHAR

static OldJobListName[JOBNAMELENGTH1;
DBCHAR

static pszJobID;
PSZ

static qualptr;
PSZ

static AccountingPeriods=0;
USHORT

snitch (msg) f case HM INITDLG: /*_____________________________________________________*/
/* _ * This could take a while, so change pointer.
*/
WinSetPointer(HWND_DESKTOP, WinGuerySysPointer(HWND DESKTOP, SPTR WAIT, TRUE));
/*____________________________________________________________________*/
/* disable period controls and set the month/period radiobutton - jdb */
/*____________________________________________________________________*/
for (i=DID DAYTIMER PERIOD1; i<=DID DAYTIMER PERIODICALLY; i++) C
IIinEnablellindow(WiMdindowFromID(hWnd, i), FALSE);
/* for '/
WinSer>dDlgItemMsg(hund, RBID MONTH, BM SETCHECK, MPFROMSHORT(TRUE), 0);
ADSSetFormat(hwnd, DID DAYTIMER DATE) pUserAttr->szDateFmtCode);
/*___________________________________________________________*/
/* Find out how many accounting periods there are, and store */
/*___________________________________________________________*~
dbcmd(dbproc, " SELECT"
" count(*)"
" FRON ActgPrd"
" WHERE TypeCode='ACTG "' " AND FiscalYr = datepart(year, GetDate())");
dbsqlexec(dbproc);
dbresults(dbproc);
dbbind(dbproc, 1, SMALLBIND, 2, (BYTE*)BAccountingPeriods);

s while (dbnextrow(dbproc)!=NO MORE RONS);
/*
* If a JobID is found in mp2, this is a reschedule.
*/
pszJobID = (PSZ) mp2;
/*
* Set entryfield text limits...
*/
WinSerx~lgItemMsg(hwnd, DID_DAYTIMER_STARTHOUR, EM SETTEXTLIMIT, MPFROMSHORT(2), OL);
NinSer>dDlgItemMsg(hwnd; DID_DAYTIMER_STARTMIN, EM SETTEXTLIMIT, MPFROMSHORT(2), OL);
NinSencJ4lgItemMsg(hwrxi, DID_DAYTIMER_DATE, EM_SETTEXTLIMIT, MPFROMSHORT(JOBDATELENGTH 1), OL);
WinSendDlgItemMsg(hwnd, D1D_DAYTIMER_OTHERENT, EM SETTEXTLIMIT) MPFROMSHORT(2), OL);
WinSerxblgItemMsg(hwnd, DID_DAYTIMER_DATE, EM DUERYCHANGED, OL, OL);
/*
* Load the Job Name and Group combo boxes...
*/
LoadListBox(hwnd, DID_DAYTIMER JOBCOMBO, (PSZ) HULL, (PSZ)NULL, 0);
LoadListBox(hwnd, DID_DAYTIMER GRPCOMBO, (PSZ) NULL, (PSZ)NULL, 0);
/*
* If this is a reschedule, fill in the fields and buttons as needed...
*/
if (pszJobID) C
/*
* Get the scheduling password from the user if is required...
*/
pwdStruct.usPwdType = PLID_SCHED;
pwdStruct.pszJobData = (PSZ) pszJobID~
pwdStruct.usDataType = PSID DATA JOBID;
/*
* Does the user know the password?
*/
if (!(WinDlgBox(HWND DESKTOP, hwnd, (PFNWP)EnterPasswordDlgProc, (HMODULE)NULL, IDD PbIDENTER, (PVOID) &pwdStruct))) C
/* Nope */
DosBeep( 300, 300 );
/* Restore the pointer to the default and go home */
WinSetPointer(HWND DESKTOP, uir>QuerySysPointer(HWND DESKTOP, SPTR ARROW, TRUE));
WinDismissDlg(hwnd, TRUE);
return(0);
/* i f */
/*
* Fetch the handle of the icon in the top corner of dlgbox. We * save this handle because we will restore this icon before * exiting so that the dlgproc will destroy the correct icon.
*/
hpointerlcon = (HPOINTER) WinSer>dDlglterttAsg(hwnd, DID_DAYTIMER_ICON, SM DUERYHANDLE, (MPARAM)OL, (MPARAM) OL);
/*
* Set corner icon to the reschedule picture.
*/
llinSerxDlgItemMsg(hwnd, DID DAYTIMER-ICON, Sh_SETHANDLE, ~~ ~'~~~~~
nt ..a. e,e (MPARAM)hpointerArraylIDI RESCHED - IDI BITBASE7, (MPARAM) OL);
/*
* Set the window title to make it look like we are rescheduling.
*/
HinLoadString(hab, (HMOOULE)NULL, IDS RESCHEDULE, sizeof(Buffer>, Buffer);
sprintf(euffer, "%s - Job %s", Buffer, pszJobID);
WinSetNindowText(hwnd, Buffer);
/*
* Select all of the important stuff for this job. Note that this * select uses a 'for browse' clause, preventing its migration to * a stored procedure.
*/
safe_dbfcmd(dbproc, " SELECT"
" JobRunID,"
" JobListName,"
" UserRqst,"
" CurrentStat,"
" GrpName,"
" PriorityFlag,"
" datepart(hour, NxtRuroateTime),"
" datepart(minute, NxtRunDateTime),"
" convert(char(%d), NxtRunDateTime, 1),"
" RecurWeekday,"
" RecurMonthday,"
" RecurMonth,"
" RecurPrd"
" FROM SSPendingJobTable"
" WHERE JobRunID = %ld"
" FOR browse", JOBDATELENGTH, atol(pszJobID));
dbsqlexec(dbproc);
dbresults(dbproc);
dbbind(dbproc, 1, INTBIND, (DBINT) 0, (BYTE *) &JobRunID);
dbbind(dbproc, 2, NTBSTRINGBIND, (LONG)sizeof(JobListName), JobListName);
dbbind(dbproc, 3) CHARBIND, (DBINT) 1, &UserRqst);
dbbind(dbproc, 4, CHARBIND, (DBINT) 1, &CurrentStat);
dbbind(dbproc, 5) NTBSTRINGBIND, (LONG)sizeof(GrpName), GrpName);
dbbind(dbproc, 6, CHARBIND, (DBINT) 1, (BYTE *) &PriorityFlag);
dbbind(dbproc, 7, SMALLBIND) (DBINT) 0, (BYTE *) &start hour);
dbbind(dbproc, 8, SMALLBIND, (DBINT) 0, (BYTE *) &start min);
dbbind(dbproc, 9, NTBSTRINGBIND, (LONG)sizeof(NextRunDate), NextRunDate);
dbbind(~proc, 10, TINYBIND, (DBINT) 0, (BYTE *) &RecurWeekday);
dbbind(~proc, 11, SMALLBIND, (DBINT) 0, (BYTE *) &RecurMonthday);
dbbind(dbproc, 12, SMALLBIND, (DBINT) 0, (BYTE *) &RecurMonth);
dbbind(dbproc, 13, SMALLBIND, (DBINT) 0) (BYTE *) BRecurPrd);
if (~nextrow(dbproc) != HO MORE ROWS) C
/*
* HEY! Job is running - can't deal with that.
*/
if (CurrentStat =_ 'R') C
DosBeep( 400, 50 );
WinLoadString(hab, (HMODULE)NULL, IDS_CANT RESCHED, sizeof(szTextl), szTextl);
IIinLoadString(hab, (HMODULE)NULL, IDS_WARNING, sizeof(szText2), szText2);
WinMessageBox(H11ND DESKTOP, hwnd, szTextl, szText2, 0, MB OK ; MB WARNING ; MB MOVEABLE);

'~~ ~~~.6'~~

while (dbnextrow(dbproc) != NO MORE ROWS);
WinSetPointer(HNND DESKTOP, WirN~uerySysPointer(HWND DESKTOP, SPTR ARRON, TRUE));
WinDismissDlg(hwnd, FALSE);
return(0);
J /* if */
/*
* Dualptr is a buffer containing the timestamp (thanks to the * select for browse) built into a where clause, which we * will use later.
*/
qualptr = dbqual(dbproc, -1, "SSPendingJobTable");
/* Set defaults for the two combo boxes */
NinSetDlgItemText(hwnd, DID DAYTIMER JOBCOMBO, JobListName);
4linSetDlgItemText(hwnd, DID DAYTIMER GRPCOMBO, GrpName);
/*
* Save the current JobListName so that we won't requery * the user for the password if the JobListName is not changed.
*/
strcpy(OldJobListName, JobListName);
/*
* The user will not be allowed to change the UserRqst flag * from the reschedule screen. Hide the HOLD check box and save * the original UserRqst so that it can be restored on the * new job.
*/
if (sCurrentView == IDM VIEIIDEFAULT) C _ WinEnableWindowUpdate(WinWindowFromID(hwnd, DID DAYTIMER_HOLD), FALSE );
old UserRequest = UserRqst;
l /* if */
/*
* If the jobs was an ASAP (PriorityFlag = '2'), set ASAP checkbox...
*/
if ((SHORT)PriorityFlag =_ '2') WinSer>dDlgItemMsg(hwnd, DIO_DAYTIMER_ASAP, BM_CLICK, MPFROMSHORT(TRUE), MPFROMSHORT(0));
/*
* Else set the time and date of the first execution and then * select the checkboxes for month and day if the job will * automatically be rescheduled after the first run.
*/
else C
WinSetDlgItemShort(hwnd,DID DAYTIMER STARTHOUR,start hour, FALSE);
sprintf(DisplayTime, "X02d", start_min);
WinSetDlgItemText(hwnd, DID_DAYTIMER_STARTMIN, DisplayTime);
ADSConvertDateFromMDY(pUserAttr->szDateFmtCode, ConvertDate, NextRunDate);
WinSetDlgItemText(hwnd, DID DAYTIMER DATE, ConvertDate);
/*
* Note: Weekdays are 'backwards' in RecurWeekday: SFTWTMS
*/
usNUm = (USHORT) RecurNeekday;
for (i = 0; i < 7; i++) C
if (usNum & ((USHORT) 1 « i)) HinSer>dDlgItemMsg(hwnd, D1D DAYTIMER SUN + i, BM CLICK, MPFROMSHORT(1), MPFROMSHORT(0));
/* for */
if (RecurMonthday) C
/*
* If a monthday was given, clear and disable these buttons...
*/
ToggleButtonRange(hwnd, DID_DAYTIMER_SUN, DID_DAYT1MER_DAILY, FALSE, TRUE);
ToggleButtonRange(hwnd, DID_DAYTIMER_1ST, DID DAYTIMER LAST, FALSE, TRUE);
if (RecurMonthday == 255) 4linSer>dDlgItemMsg(hwnd, DID DAYTIMER LAST, BM CLICK, MPFROMSHORT(1), 0);
else if (RecurMonthday == 1) WinSer>dDlgItemMsg(hwnd, DID DAYTIMER-1ST, BM CLICK, MPFROMSHORT(1), 0);
else SIinSetDlgItemShort(hwnd, DID DAYT1MER OTHERENT, RecurMonthday, FALSE);
/* if */
/*
* Welt, might as well put the months in backwards too:
* DNOSAJJMAMFJ
*/
usNum = (USHORT) RecurMonth;
for (i = 0; i < 12; i++) f if (usNum & ((USHORT) 1 « i)) WinSenclOlgltemMsg(hwnd, DID_DAYTIMER_JAN + i, BM CLICK, MPFROMSHORT(1), MPFROMSHORT(0));
/* for */
/*__________________________________________*/
/* Fill in the Period Checkboxes if need be */
/*__________________________________________*/
if(RecurPrd) C
WinSerx~lgItemMsg(hwnd, RBID PERIOD, BM CLICK, MPFROMSHORT(TRUE), 0);
usNum = (USHORT) RecurPrd;
for (i = 0; i < 13; i++) C
if (usNum & ((USHORT) 1 « i)) WinSerxblgItertMsg(hwnd, DID_DAYTIMER_PERIOD1 + i, BM CLICK, MPFROMSHORT(1), MPFROMSHORT(0));
/* for *%
/* i f */
/* End ELSE ! ASAP */
/* End If Row Found */
dbcanquery(dbproc);
white (dbresults(dbproc) != NO MORE RESULTS) dbcanquery(dbproc);
/* End Set Defaults */
/*
* ELSE this not a reschedule, so we don't have any defaults to set.
*/
else C
WinSetHindowText(hwnd, "Schedule a Batch");

w' !~ C~ ~ S /1 i ~
t .l : ~" a r.~ .:s. ~ a /* else */
/*
* HEY! Wake that user up.
*/
WinSetPointer(HWND DESKTOP, WinOuerySysPointer(HWND DESKTOP, SPTR ARROW, TRUE));
return(0);
case WM_CONTROL: /*___________-________________________-________________*/
usNotifyCode = (USHORT)SHORT2FROMMP(mp1);
ulData = (ULONG)LONGFROMMP(mp2);
/*
* Watch the user for clues that allow us to avoid input errors.
*/
switch ((USHORT)SHORT1FROMMP(mp1)) C /* On control ID */
case DID_DAYTIMER_STARTHOUR: /*-----------------------------------*/
bresult = WinOueryDlgItemShort(hwnd, DID_DAYTIMER STARTHOUR, &start hour, FALSE);
if ((usNotifyCode == EN CHANGE)) /*
* If the hour looks like 24hr format, disable the am/pm buttons.
*/
if (!bresult ;; start hour > 12) C
WinEnableWindow(WinWindowFromID(hwnd, DID DAYTIMER PM), FALSE);
WinEnableWindow(WinWindowFromID(hwnd, DID DAYTIMER AM), FALSE);
/* i - -f *~
else C
WinEnablellindow(WinWindowFromID(hwnd, DID DAYTIMER_PM), TRUE);
WinEnableWindow(WinWirxiowFramID(hwnd, DID DAYTIMER AM), TRUE);
/* else *~
break;
#i f 0 jdb - remove gorpy rewording of checkbox case DID_DAYTIMER_HOLD: /*----------------------------------------*/
if (usNotifyCode == BN CLICKED ;; usNotifyCode == BN DBLCLICKED) /* Nothing real important *%
if (SHORT1FROMMR(WinSer>dDlgItemMsg(hwnd, DID DAYTIMER HOLD, BM_OUERYCHECK, OL, OL ))) WinSetDlgItemText(hwnd, DID DAYTIMER HOLD, "Held ");
else WinSetDlgItemText(hwnd, DID DAYTIMER HOLD, "Hold?");
break;
#endif case DID DAYTIMER ASAP: /*----------------------------------------*/
/*
* If ASAP is selected, disable most everything else * because this job can not be rescheduled. tf ASAP
* is being cleared, reverse the process.
*/
mresult = WinSer>dDIgItemMsg( hwnd, D1D_DAYTIMER_ASAP, BM OUERYCHECK, OL, OL );
flag = !(BOOL)SHORT1FROMMR(mresult);
ToggleEntryField(hwnd, DID_DAYTIMER_STARTTEXT, DID_DAYTIMER_STARTHOUR, flag);
ToggleEntryField(hwnd, DID_DAYTIMER_STARTCOLON, DID DAYTIMER_STARTMIN, flag);
WinEnablellindow(WinWindowFromID(hwnd, DID DAYTIMER PM), flag);

uinEnableWindow(41in41indowFromID(hwnd, DID_DAYTIMER AM), flag);
ToggleEntryField(hwnd, DID_DAYTIMER_DATETEXT, DID_DAYTIMER_DATE, flag);
ToggleEntryField(hwnd, DID DAYTIMER_OTHERTEXT, DID DAYTIMER OTHERENT, flag);
S~inEnableWindow(WinWindowFromID(hwnd, RBID_MONTH), flag);
WinEnable4lindow(WinWindowFromID(hwnd, RBID PERIOD), flag);
WinEnableWindow(WinWindowFromID(hwnd, PBID NOW), flag);
if (WinSerx~lgItemMsg(hwnd, RB1D MONTH, BM ~UERYCHECK, 0, 0) ii !flag) C
ToggleButtonRange(hwnd, DID DAYTIMER_JAN, DID DAYTIMER ALL, FALSE, flag);
ToggleButtonRange(hwnd, DID DAYTIMER SUN, DID DAYTIMER DAILY, FALSE, flag);
/* i f */
if (WinSenc~lgItemMsg(hwnd, RBID PERIOD, BM OUERYCHECK, 0, 0) ii !flag) C
ToggleButtonRange(hwnd, DID_DAYTIMER_PERIOD1, DID_DAYTIMER_PERI001+AccountingPeriods-1, FALSE) flag);
WinEnableuindow(4linWindowFromID(hwnd, DID DAYTIMER PERIODICALLY), flag);
/* if */
ToggleButtonRange(hwnd, DID DAYTIMER_1ST, DID DAYTIMER LAST, FALSE, flag);
break;
case RBID PERIOD: /*______________________________________________*/
if(AccountingPeriods > 0) C
ToggleButtonRange(hwnd, DID_DAYTIMER_SUN, DID_DAYTIMER_DAILY, FALSE, FALSE);
ToggleButtonRange(hwnd, DID DAYTIMER_JAN, DID DAYTIMER ALL, FALSE, FALSE);
ToggleButtonRange(hwnd, DID_DAYTIMER PERIOD1, DID_DAYTIMER_PERIOD1 + AccountingPeriods-1, FALSE, TRUE);
WinEnable4lindow(NinWindowFromID(hwnd, DID_DAYTIMER_PERIODICALLY), TRUE);
WinSetDlgItemText(hwnd, STID DAY OFFSET, "... of the Period");
/* if *~
else WinSerxDlgItemMsg(hwnd, RBID MONTH, BM SETCHECK, MPFROMSHORT(TRUE), 0);
break;
case RBID_MONTH: /*_______________________________________________*/
ToggleButtonRange(hwnd, DID_DAYTIMER_SUN, DID DAYTIMER DAILY, FALSE) TRUE);
ToggleButtonRange(hwnd, DID DAYTIMER JAN, DID DAYTIMER ALL, FALSE, TRUE);
ToggleButtonRange(hwnd, DID_DAYTIMER PERIOD1, DID DAYTIMER PERI001 + AccountingPeriods-1, FALSE, FALSE);
w i nEnab l e41 i ndow( w i r>wI i ndowF roml D ( hwnd, DID_DAYTIMER_PERIODICALLY), FALSE);
WinSetDlgItemText(hwnd, STID DAY OFFSET, "... of the Month");
break;
case DID DAYTIMER OTHERENT: /*------------------------------------*/
/* _ _ * Some activity at the month day entry field...
*/
4~~ ~~~~ ~~s ~:1~~~ ~ ~.,~ ~

sNumChars = Ninauery4findowText(NinWindowFromID(hwnd, DID DAYTIMER OTHERENT), sizeof(Buffer), Buffer);
if (usNotifyCode == EN CHANGE) C
if(sNunChars >= 1) if (WinSenc~lgltemMsg(hwnd, RBID MONTH, BM gUERYCHECK, 0, 0)) ToggleButtonRange( hwnd, DID_DAYTIMER_SUN, DID_DAYTIMER_DAILY, FALSE, TRUE );
Toggle8uttonRange( hwnd, DID_DAYTIMER_1ST, DID DAYTIMER-LAST, FALSE, TRUE );
/* if *%
/* if */
break;
case DID DAYTIMER DAILY: /*---------------------------------------*/
/* If Daily button has been selected) select all days */
ToggleButtonRange( hwnd, DID_DAYTIMER_SUN, DID_DAYTIMER_SAT, TRUE, TRUE );
ToggleButtonRange( hwnd, DID_DAYTIMER_1ST, DID DAYTIMER LAST, FALSE, TRUE );
break;
case DIO_DAYTIMER_1ST: /*-----------------------------------------*/
if (usNotifyCode == BN CLICKED) mresult = WinSerxDlgItemMsg( hwnd, DID OAYTIMER-1ST) BM QUERYCHECK, OL, OL );
WinSetOlgItemText(hwnd, DID DAYT1MER OTHERENT, NULL);
/* If Daily button has been selected, deselect all days */
if (SHORT1FROMMR(mresult)) C
if(WinSer>dDlgItemMsg(hwnd, RBID_MONTH, BM_GUERYCHECK, 0, 0)) ToggleButtonRange( hwnd, OID_DAYTIMER_SUN) DID_DAYTIMER_DAILY, FALSE, TRUE );
ToggleButtonRange( hwnd, DID_DAYTIMER_LAST, DID DAYTIMER LAST, FALSE, TRUE );
/* if *~
/* i f */
break;
case DID DAYTIMER_LAST: /*----------------------------------------*/
if (usNotifyCode == BN CLICKED) C
mresult = WinSer>dDlgItemMsg( hwnd, DID DAYTIMER LAST, BM OUERYCHECK, OL, OL );
HinSetDlgItemText(hwnd, DID DAYTtMER OTHERENT, NULL);
if (SHORT1FROMMR(mresult)) C
if (WinSer>dDlgItemMsg(hwnd, RBID_MONTH, BM_CUERYCHECK, 0, 0)) ToggleButtonRange( hwnd, DID_DAYTIMER_SUN, DID_DAYTIMER DAILY, FALSE, TRUE );
Toggle8uttonRange( hwnd, DID_DAYTIMER 1ST, D1D DAYTIMER-1ST, FALSE, TRUE );
/* i f *%
/* if */
break;
/*
* If a day is selected disable the 1st and Last buttons.
*/

:'~ c"~ '~ (' ~.f _~ :~ ~ d. 'S a case DID_DAYTIMER_SUN: /*-------------------___-------------------*/
case DID_DAYTIMER_MON: /*____________________-______-__-__________*/
case DID_DAYTIMER_TUE: /*-----------------------------------_-__-_*/
case DID_DAYTIMER_WED: /*-------------------------_--------------_*/
case DID_DAYTIMER_THU: /*--------------------------_-_-__-------_-*/
case DID_DAYTIMER_FRI: /*-----------------------------_--___---___*/
case DID_DAYTIMER_SAT: /*---------------__-----------___--__-----_*/
if (usNotifyCode == BN CLICKED) C _ ToggleButtonRange( hwnd, DID_DAYTIMER_1ST, D1D_DAYTIMER_LAST, FALSE, TRUE );
NinSetDlgltemText(hwnd, OID DAYTIMER OTHERENT, NULL);
/* i - -f *~
break;
/* switch */
break;
case 41M DESTROY: /*-____________________________-_______________________*/
/* If this was a reschedule */
if (pszJobID) C
/* Free the qualptr buffer */
dbfreequal(qualptr);
/* Restore the original corner icon but don't show it */
uinShowHindow(Wir>WindowFromID(hwnd, DID_DAYTIMER_ICON), FALSE);
uinSerxblgItemMSg(hwnd, DID_DAYTIMER_ICON, SM SETHANDLE, (MPARAM) hpointerIcon, (MPARAM) OL);
/* i f */
NinDismissDlg(hwnd, FALSE);
break;
case 41M COMMAND: /*_____________________________________________________*/
switch (COMMANDMSG(8msg)->cmd) C
case PBID NOW: /*______________________--________________________*/
C
CHAR datel9), timel9);
dbcmd(dbproc, "SELECT"
" convert(char(8), GetDate(), 1),"
" convert(char(8)) GetDate(), 8)");
dbsqlexec(dbproc);
dbresults(dbproc);
dbbind(dbproc, 1, NTBSTRINGBIND, 9, date);
dbbind(dbproc, 2, NTBSTRINGBIND, 9, time);
while(dbnextrow(dbproc)!=NO_MORE_ROIIS);
ADSConvertDateFromMDY(pUserAttr->szDateFmtCode, ConvertDate, date);
WinSetDlgItemText(hwnd) DID DAYTIMER DATE, ConvertDate);
timet2) = timely) = 0;
WinSetDlgItemText(hwnd, DID_OAYTIMER STARTHOUR, time);
WinSetDlgItemText(hwnd, DID DAYTIMER_STARTMIN, time+3);
msg = 0; /* Maintain dialog box */
break;
case DID_DAYTIMER_PERIODICALLY: /*--------------------------------*/
Toggle8uttonRange(hwnd, DID_DAYTIMER_PERIOD1, DID_DAYTIMER_PERIOD1 + AccountingPeriods-1, TRUE, TRUE );
msg = 0; /* Maintain dialog box */
break;
case DID_DAYTIMER_ALL: /*-----------------------------------------*/
Toggle8uttonRange(hwnd, D1D_DAYTIMER JAN, DID DAYTIMER DEC, TRUE, TRUE );

,~, : E.

msg = 0; /* Maintain dialog box */
break;
case DID_DAYTIMER_DAILY: /*--------------------------------__---__*/
ToggleButtonRange(hwnd, DID_DAYTIMER SUN, DID_DAYTIMER_SAT, TRUE, TRUE );
ToggleButtonRange(hwnd, DID_DAYTIMER_1ST, DID_DAYTIMER_LAST, FALSE, TRUE );
WinSetDlgItemText(hwnd, DID DAYTIMER_OTHERENT, NULL);
msg = 0; /* Maintain dialog box */
break;
case DID CANCEL: /*_______________________________________________*/
break;
case DID OK: /*_______________________-___________________________*/
msg = 0; /* Allow error conditions to maintain dialog box */
WinLoadString(hab, (HMODULE)NULL, IDS ERROR, sizeof(szText2>, (PSZ)szText2);
/* Read the combo box entries */
if (!WinaueryDlgItemText(hwnd, DID_DAYTIMER JOBCOMBO, JOBNAMELENGTH, JobListName)) C
WinLoadString(hab, (HMODULE)NULL, IDS_NO JOB SELECTED, sizeof(szTextl), (PSZ)szTextl);
WiMIessage8ox(NWND DESKTOP, HWND DESKTOP, szText1, szText2, (USHORT) NULL, MB OK i MB ERROR ; MB MOVEABLE);
break;
/* i f */
if (!WinGueryDlgItemText(hwnd, DID DAYTIMER GRPCOMBO, GROUPNAMELENGTH, GrpName)) C
WinLoadString(hab, (HMODULE)NULL, IDS NO GROUP SELECTED, sizeof(szTextl), (PSZ)szTextt);
WinMessageBox(HWND DESKTOP, HWND DESKTOP, szTextl, szText2, (USHORT) NULL, MB OK ; MB ERROR ; MB MOVEABLE);
break;
/* if */
/*
* If this is a reschedule and the JobListName has been changed, * or if this is a newly scheduled job) query for a password if * needed.
*/
if ((pszJobID && strcmp(OldJobListName, JobListName) != 0) ii !pszJobID) /*
* Get password from user if needed.
*/
pwdStruct.usPudType = PLID_SCHED;
pwdStruct.pszJobData = (PSZ) JoblistName;
pwdStruct.usDataType = PWD_DATA_JOBNAME;
if (!(WinDlgBox(HWND DESKTOP, hwnd, (PFNWP)EnterPasswordDlgProc, (HMODULE)NULL, IDD PWDENTER, (PVOID) &pwdStruct))) /*
* Oops, the users does not know the password, so return.
*/
DosBeep( 300, 300 );
WinLoadString(hab, (HMODULE)NULL, IDS_WRONG PASSWORD, sizeof(szTextl), (PSZ)szTextt);
WiMlessageBox(HWND DESKTOP, HWND_DESKTOP, szTextl, szText2, (USHORT) NULL, MB OK ~ MB ERROR ; MB MOVEABLE);

r r~~ ';'~~_~r~
r LIinDismissDlg(hwnd, TRUE);
break;
/* if */
/* if */
HinSetPointer(HNND_DESKTOP, 4lir>DuerySysPointer(H41ND DESKTOP, SPTR 11AIT, TRUE));
/*
* If this is a reschedule, replace the original UserRqst.
* Else, check the HOLD checkbox state and set UserRqst * accordingly.
*/
if (pszJobID 88 sCurrentView == IDM_VIENDEFAULT) UserRqst = old UserRequest;
else if (NinSer>dDlgItemMsg(hwnd, DID DAYTIMER_HOLD, BM_~UERYCHECK, OL, OL) __ (MRESULT)1) UserRqst = 'H';
else UserRqst = ' ';
/* else */
/*
* If the ASAP button is selected, use the current date/time.
*/
if (NinSer>dDlgItemMsg(hwnd, DID DAYTIMER_ASAP, BM ~UERYCHECK, OL, OL) __ (MRESULT)1) C
safe dbfcmd(dbproc, lnsSSPendingJobTable "
n ~y~y ~~~~~y ~nys~n '2y " Xd Xd Xd Xd ""
r JobListName, UserRqst, GrpName, RecurNeekday, RecurMonthday, RecurMonth) RecurPrd);
/* i f */
/*
* ELSE we get to build a job that can reschedule.
*/
else C
/* Get the starting date */
if (!NinOueryDlgItemText(hwnd, DID DAYTIMER DATE, sizeof(euffer), Buffer)) C
NinLoadString(hab, (HMODULE)NULL, IDS NO DATE, sizeof(szTextl), (PSZ)szTextl);
HiMlessageBox(HNND_DESKTOP, HNND DESKTOP, szTextl, szText2, (USHORT) HULL, MB OK i MB ERROR ~ MB MOVEABLE);
break;
/* i f */
else C
ADSConvertDateToMDY(pUserAttr->szDateFmtCode, Buffer, ConvertDate);
sprintf(NextRunDate, "'Xs " , ConvertDate);
/* Get the starting hour */
bresult = NinOueryDlgltemShort(hwnd, DID DAYTIMER STARTHOUR, 8start hour, FALSE);
if (!bresult ;; start hour > 23) C
NinLoadString(hab, (HMODULE)NULL, IDS TIME_INCORRECT, */
for (i = 0; i < 12; i++) if (WinSendDlgItemMsg(hwnd, DID DAYTIMER_JAN + i, BM_WUERYCHECK, OL, OL) __ (MRESULT)1) RecurMonth ;_ ((USHORT)1 « i);
/*
* Period - build it backwards */
for (i = 0; i < 13; i++) if (WinSerxDlgItertMsg(hwnd, DID DAYTIMER_PERIOD1 + i, BM_OUERYCHECK, OL, OL) __ (MRESULT)1) RecurPrd ;_ ((USHORT)1 « i);
/*
* If the user wants this to reschedule, we need * (weekday ;; monthday) && (month info ;; period info).
*/
if ((RecurWeekday ;; RecurMonthday) &8 !(RecurMonth ;; RecurPrd)) C
WinLoadString(hab, (HMODULE)NULL, WinSerxDlgltemlAsg(hwnd, RBID_MONTH, BM GUERYCHECK, 0, 0) ? IDS_NEED_MONTH
IDS_NEED_PERIOD, sizeof(szTextl), (PSZ)szText1);
WiMlessageBox(H41ND DESKTOP, HHND_DESKTOP, szTextl, szText2) (USHORT) NULL, MB OK ; MB ERROR ~ MB MOVEABLE);
break;
l* if */
if ((RecurMonth ;; RecurPrd) &8 !(Recurlleekday ;; RecurMonthday)) C
WinLoadString(hab, (HMODULE)NULL, IDS NEED DAY, sizeof(szTextt), (PSZ)szTextl);
WiMlessageBox(HWND DESKTOP, HWND_DESKTOP, szTextl, szText2, (USHORT) NULL, MB OK ; MB ERROR ~ MB MOVEABLE);
break;
/* if */
/* Build the command buffer for the insert */
safe_dbfcmd(dbproc, " InsSSPendingJobTable "
n \~y\~y \y\y \~~Xs\". \"3\". Xs, n a Xd, %d, Xd, Xd, \"\uu~
JobListName, UserRqst, GrpName, NextRunDate, RecurWeekday, RecurMonthday, RecurMonth, RecurPrd);
/* End of Dialog Box data extraction */
/* Schedule that job! */
if (!(dbsqlexec(dbproc))>
C
WinLoadString(hab, (HMODULE)NULL, IDS SGL REJECTED, sizeof(szTextl), (PSZ)szTextl);
WiMlessageBox(H41ND DESKTOP, HWND_DESKTOP, szTextl, szText2, (USHORT) NULL, MB OK ~ MB ERROR ; MB MOVEABLE);
break;
/* i f */
dbcanquery(dbproc);
while (dbresults(dbproc) != HO MORE RESULTS) dbcanquery(dbproc);

/*
* Not done yet. If this is a reschedule we need to try and * delete the original job.
*/
if (pszJobID) C
/*
* Restore the original corner icon but don't display the * change.
*/
uinEnableWindouUpdate(WinWindowFromlD(hwnd, DID_DAYTIMER_ICON), FALSE);
WinSencblgItemMsg(hwnd, DID_DAYTIMER_ICON, SM SETHANDLE, (MPARAM) hpointerIcon, (MPARAM) OL);
/*
* Try the SOL delete using the timestamp obtained earlier.
*/
safe_dbfcmd(dbproc, " DELETE SSPendingJobTable Xs'~, qualptr);
dbfreequal(qualptr);
if ((dbsqlexec(dbproc) _= FAIL) ;; (dbresults(dbproc) _= FAIL)) C
Dos8eep(400, 50>;
4linLoadString(hab, (HMOOULE)NULL, IDS J08 NOT REMOVED, sizeof(Buffer), Buffer);
UinLoadString(hab, (HMODULE)NULL, IDS WARNING, sizeof(szTextl), szTextl);
4linMessageBox( HWND DESKTOP, hwnd, szTextl, Buffer, 0, MB OK ; MB WARNING ; MB MOVEABLE);
/* if dbcanquery(dbproc);
while (dbresults(dbproc) != NO MORE RESULTS) dbcanquery(dbproc>;
) /* if(pszJobID */
/* Goose the scheduler to get it to examine the runnables. */
if (!ADSNetConnect(&ulNetConnect, szServerName, BATCHD SERVICE)) ADSNetDisconnect(ulNetConnect);
WinDismissDlg(hwnd, TRUE);
return(0);
/* switch HM_COMMAND */
break;
/* switch */
return WinDefDlgProc(hwnd, msg, mpt, mp2);
/* DayTimerDlgProc */
/********************************x********************************************/

/* */
/* ToggleButtonRange */
/* */
/* Disable/Enable and deselect/select all of the buttons between */
/* two ids. */
/* */
/* Note: We don't allow for selected disabled buttons */
/*****************************************************************************/

VOID ToggleButtonRange(H41ND hwnd, USHORT usButtonStart, USNORT us8uttonEnd, BOOL fSelect, BOOL fEnable) C
USHORT i;
for (i = usButtonStart; i <= usButtonEnd; i++) c if (fEnable) C
uinEnableuindow(uinuindowFromID(hwnd, i), fEnable);
uinSerxDlglteirMsg(hwnd) i, BM SETCHECK, MPFROMSHORT(fSelect), MPFROMSHORT(0));
/* i f */
else C
uinSendDlgItemMsg(hwnd, i, BM SETCHECK, MPFROMSHORT(fSelect), MPFROMSHORT(0));
uinEnableuindow(uinuindowFromID(hwnd, i), fEnable);
/* else */
/* for */
/* ToggleButtonRange */
/*******xx******************************************************x*************/

/* */
/* ToggleEntryField */
/* */
/* Enable/Disables an entry field and its description. */
/* */
/*********************x**xxxx**x*******************x**************************/

VOID ToggleEntryField(HUND hwnd, USHORT idText, USHORT idEntry, BOOL fEnable) C
if (fEnable) C
uinEnableuindow(uirrilindowFromID(hwnd, idText), TRUE);
uinEnableuindow(uir>SlindowFromID(hwnd, idEntry), TRUE);
/* if */
else C
uinSetuindowText(uinl~lindowFromID( hwnd, idEntry), "");
uinEnableuindow(uinuindowFromID(hund, idEntry), FALSE);
uinEnableuindow(uinuindowFromID(hwnd) idText), FALSE);
/* else */
/* ToggleEntryField */
/x__________________________________________________________________________*/
/* sate dbfcmd - turns " into ' for purposes of the database */
/*__________________________________________________________________________*/
VOID safe dbfcmd(DBPROCESS *dbproc, char *fstring, ...) C
char bufferC3000J;
int i;
va_list marker;
for(i=0; fstringti); i++) if (fstringlil =_ '\"'>
fstringlil = 1;
va_start(marker, fstring);
vsprintf(buffer, fstring, marker);
va end(marker);
for(i=0; buffer(i); i++) if (bufferfi7 =_ ~\
bufferli) _ '\~';
for(i=0; buffer(iI; i++) if (bufferli) _= t) buffer(i7 = '\"';
dbcmd(dbproc, buffer);
/* safe dbfcmd */

char szRevisionl] _ "SRevision: 2.1 $ batchd.c":
/************************************************************************
* Copyright (c) 1990, 1991, 1992, 1993 American Airlines * File: BATCHD.C
* System: Batch Scheduler * Description: This module control the execution of batch jobs.
************************************************************************/
//#define TBASE LOGIN
#define INCL_DOS
#define INCL_uIN
#define INCL DOSERRORS
#include <os2.h>
#define DBMSOS2 #include <sybfront.h>
#include <sybdb.h>
#include <stdio.h>
#include <string.h>
#include <process.h>
#include <stddef.h>
#include <malloc.h>
#ifdef TBASE_LOGIN
#define EXTERN
#include "adslen.h"
#include "ads. h"
#endif #include "adsnet.h"
#include "adsdnet.h"
#include "batchdef.h"
#define STACKSIZE 8192 #define MAX_MACHINES 300 #define THREAD VOID(*)(PVOID) typedef struct LONG lJobID;
CHAR szJobListName(JOBNAMELENGTH7;
CHAR szGroupName(GROUPNAMELENGTH7;
CHAR szMachineName(MACHINENAMELENGTH7;
CHAR szSchedBy(JOBEDITBYLENGTH7;
JOBINFO, *PJOBINFO;
VOID Scheduler(DBPROCESS *dbprocScheduler);
VOID TalkToClient(ULONG uIADSNet);
VOID Execute(LONG lJobID);
VOID GetMachine(PULONG uIADSNet, PJOBINFO pJobInfo);
BOOL VerifyBatch(ULONG uIADSNet, PJOBINFO pJobInfo);
DBPROCESS *dbprocJob;
ULONG hsemSGl; /* Control access to dbprocJob */
/* Execute, GetMachine, and */
/* Verify8atch will REQUEST hsemSGL */
ULONG hsemExit; /* Cleared when TalkToClient is done */
ULONG hsemScheduler; /* Schedule-thread run-state control */
/* Scheduler thread will wait on */

,.. .,:.

/* hsemScheduler */
ULONG hsemNewJobs; /* Control job-accept state */
/* Scheduler and TalkToClient will */
/* wait on hsemNewJobs */
ULONG hsemJobCount; /* Controls access to global:usJobCount */
/* TalkToClient, and Execute will */
/* Request hsemJobCount */
USHORT usJobCount = 0;
/*______________________________________________________________________*/
/* Entry point. */
/*______________________________________________________________________*/
VOID main(int argc, char *argvll) DBPROCESS *dbprocScheduler;
ULONG uIADSNet;
CHAR szServerNameI301;
#ifdef TBASE_LOGIN
USERATTR *pUserAttr;
DBPROCESS *dbprocTBase;
NAB hab;
HMO hmq;
#else LOGINREC *login;
#endif /*______________________________________________________________*/
/* If we didn't get the correct number of arguments, exit. */
/*______________________________________________________________*/
if (argc != 2)C
puts("Usage: batchd SQLServer");
exit(0);
J /* t f */
#ifdef TBASE LOGIN
hab = WinInitialize(0);
hmq = WinCreateMsgGueue(hab, 0>;
ADSRegisterClass(hab);
pUserAttr = ADSlogin(8dbprocTBase, NULL, NULL);
// WinDestroyMsgOueue(hmq);
// WinTerminate(hab);
#else /*______________________________________________________________*/
/* Create a SOL Server login structure. */
/*______________________________________________________________*/
login = dblogin();
DBSETLUSER(login, "ProcAdm");
DBSETLPHD(login, "ProcAdm");
DBSETLAPP(login, "Batch Daemon");
#endif /*______________________________________________________________*/
/* Open tuo connections to SQL Server. */
/*__.___________________________________________________________*/
#ifdef TBASE LOGIN
if ((dbprocScheduler = dbopen(pUserAttr->login, argvlll)) _= NULL)( ADSExitProgram(0);
exit(0);
l /* if */
if ((dbprocJob = dbopen(pUserAttr->login, argvll])) _= NULL)<
AOSExitProgram(0);

.., #else exit(0);
/* if */
dbuse(dbprocScheduler, pUserAttr->szDefaultDB);
dbuse(dbprocJob, pUserAttr->sz0efaultDB);
if ((dbprocScheduler = dbopen(login, argvCl7)) _= NULL) exit(0);
if ((dbprocJob = dbopen(login, argv(17)) _= NULL) exit(0);
// dbuse(dbprocScheduler, "tbase");

// dbuse(dbprocJob) "tbase");

#endif /*______________________________________________________________*/

/* Has the service already been registered?*/

/*______________________________________________________________*/

dbfcmd(dbprocScheduler, " SELECT ComputerName"

" FROM SSRegisteredSvc"

" tIHERE SvcName = \"Xs\"", BATCHD SERVICE);

dbsqlexec(dbprocScheduler);

dbresults(dbprocScheduler);

dbbind(dbprocScheduler, 1, NTBSTRINGBINO, sizeof(szServerName), szServerName);

szServerNamel07 = '\0';

while (dbnextrow(dbprocScheduler) != NO
MORE R041S) ;

/*______________________________________________________________*/

/* If there is a server registered, try */
to connect to it. If /* it's not running, delete the row. If */
it is running, exit.

/*______________________________________________________________*/

if (szServerNamel07) if(ADSNetConnect(&uIADSNet, szServerName, ))( BATCHD SERVICE

dbfcmd(dbprocScheduler, " DELETE SSRegisteredSvc"

" WHERE SvcName = \"Xs\"", BATCHD
SERVICE);

_ dbsqlexec(dbprocScheduler);

dbresults(dbprocScheduler);

/* i f */

else C

ADSNetDisconnect(uIADSNet);

#ifdef TBASE LOGIN
ADSExitProgram(0);
#endif exit(0);
/* else */
/* if */
/*______________________________________________________________*/
/* Create service for clients and register it. */
/*______________________________________________________________*/
if (ADSNetServerOpen(BuIADSNet, BATCHD SERVICE))( puts("ADSNetServerOpen failed (line 130)");
#ifdef TBASE_LOGIN
ADSExitProgram(0);
#endif exit(0);

J /* if */

ADSGetComputerName(szServerName);

dbfcmd(dbprocScheduler, " INSERT SSRegisteredSvc"

" VALUES (\"%s\",\"%s\")", /* jbeard */

BATCHD SERVICE, szServerName );

dbsqlexec(dbprocScheduler);

dbresults(dbprocScheduler);

/*______________________________________________________________*/

/* The job counts in the machine table */
should be zero.

/*______________________________________________________________*/

dbcmd(dbprocScheduler, " UPDATE SSMachineTable"

" SET JobCnt = 0");

dbsqlexec(dbprocScheduler>;

dbresults(dbprocScheduler);

/*______________________________________________________________*/

/* There should be no "running" jobs */
in the pending job table.

/* If there are, reset their status */
to "waiting" and decrement /* the job step number since we're not */
sure whether the step /* finished successfully. */

/*______________________________________________________________*/

dbcmd(dbprocScheduler, " UPDATE SSPendingJobTable"

" SET"

" CurrentStat = \"

" StepNum = StepNum - 1,"

" MachineName = \"\""

" uHERE CurrentStat IN (\"R\", \"T\")"
);

dbsqlexec(dbprocScheduler);

dbresults(dbprocScheduler);

/*______________________________________________________________*/

/* Initialize semaphores. */

/*______________________________________________________________*/

DosSemClear(&hsemSOL);

DosSemClear(8hsemNewJobs);

/*______________________________________________________________*/

/* Start the scheduler thread. */

/*______________________________________________________________*/

beginthread(Scheduler, NULL, STACKSIZE, dbprocScheduler);

/*______________________________________________________________*/

/* Start the thread to talk to the clients.*/

/*______________________________________________________________*/

beginthread((THREAD) TalkToClient, NULL, STACKSIZE, (PVOID) uIADSNet);

/*______________________________________________________________*/

/* Suspend this thread. */

/*______________________________________________________________*/

DosSemSetHait(8hsemExit, SEM_INDEFINITE
WAIT);

/*______________________________________________________________*/

/* De-register the service and close it. */

/*______________________________________________________________*/

dbfcmd(dbprocScheduler, " OELETE SSRegisteredSvc"

" WHERE SvcName = \"Xs\"", BATCHD SERVICE);

dbsqlexec(dbprocScheduler);

~a _Y ~ ~S ~~.

dbresults(dbprocScheduler);
ADSNetServerClose(uIADSNet);
dbclose(dbprocScheduler);
dbclose(dbprocJob);
#ifdef TBASE_LOGIN
ADSExitProgram(0);
#endif exit(0);
/* main */
/*______________________________________________________________________*/
/* This thread wilt wake up approximately every five minutes to read */
/* the pending job table. It will then start an execute thread for */
/* each job ready to be executed. */
/*______________________________________________________________________*/
VOID Scheduler(DBPROCESS *dbprocScheduler)C
LONG lJobID;
for (;;) C

/*______________________________________________________*/

/* Nait for the new jobs semaphore */
to be clear. It /* will be set if ue~re refusing neu */
jobs.

/*______________________________________________________*/

DosSem4lait(8hsemNewJobs, SEM_INDEFINITE
WAIT);

/*______________________________________________________*/

/* Set the scheduler wake-up semaphore.
*/

/*______________________________________________________*/

DosSemSet(8hsemScheduler);

/*______________________________________________________*/

/* Get a list of jobs to be executed. */

/*______________________________________________________*/

dbcmd(dbprocScheduler, " SELECT JobRunID"

" FROM SSPendingJobTable"

" WHERE CurrentStat IN (\"u\") \"G\")"

" AND (NxtRunDateTime <= getdate()"

OR PriorityFlag BETWEEN \"1\" AND \"2\")"

" AND UserRqst IN (\" \") \"S\")"

" ORDER BY PriorityFlag asc, NxtRunDateTime asc");

dbsqlexec(dbprocScheduler);

dbresults(dbprocScheduler);

dbbind(dbprocScheduler, 1, INTBIND, sizeof(lJobID), (PBYTE) 8lJobID);

/*______________________________________________________*/

/* Loop through the list of jobs. */

/*______________________________________________________*/

while (dbnextrou(dbprocScheduler) !=
NO MORE ROWS) C

/*______________________________________________*/

/* Start an execute thread for this */
job. If /* the thread creation fails (OS/2 */
1.2 will /* only support about 54 threads per */
process), /* cancel the results and we~tt try */
to process /* the jobs during the next cycle. */

/*______________________________________________*/

if (( beginthread((THREAD) Execute, NULL, STACKSIZE, (PVOID)lJobID)) _--1) dbcanquery(dbprocScheduler);

break;

/* if */

/* while */

c i ri~ '~
,~a '.~ E3 ADSNetNrite(uIADSConnect, BusRequest, sizeof(usRequest));
break;
/*______________________________________*/
/* Stop the scheduler. */
/*______________________________________*/
case BATCHD STOP:
DosSemRequest(&hsemJobCount, SEM_INDEFINITE_wAIT);
if (usJobCount) usRequest = TRUE;
ADSNetWrite(uIADSConnect, BusRequest, sizeof(usRequest));
DosSemClear(&hsemJobCount);
) /* i f */
else usRequest = FALSE;
ADSNetWrite(uIADSConnect, &usRequest, sizeof(usRequest));
fExit = TRUE;
/* else */
break;
/* switch */
/* else */
/*______________________________________________________*/
/* Break the client connection. */
/*______________________________________________________*/
ADSNetConnectionClose(uIADSConnect);
while (! fExit);
DosSemClear(&hsemExit);
endthread();
/* TalkToClient */
/*______________________________________________________________________*/
/* This thread controls the execution of a job. */
/*______________________________________________________________________*/
VOID Execute(LONG lJobID) SHORT sStepNum;

ULONG uIADSNet = 0;

CHAR chUserRequest;

CHAR szFileNameIEXECUTEFILELENGTH7;

CHAR szArgListl(STEPARGSLENGTH);

CHAR szArgList2(STEPARGSLENGTH);

EXEC_PKTExecPkt;

REXEC_PKTRetExecPkt;

USHORT cbBytesRead;

BOOL fSingleStep = FALSE;

JOBINFO Joblnfo;

/x______________________________________________________________*/
/* Get exclusive use of the dbproc. */
~*______________________________________________________________*~
DosSemRequest(&hsemSOL, SEM-INDEFINITE WAIT);
/*______________________________________________________________*/
/* Update the internal job count. */
/*______________________________________________________________*/
DosSemRequest(&hsemJobCount, SEM-INDEFINITE HA1T);
usJobCount++;
DosSemClear(8hsemJobCount);

~~~.~~

/*______________________________________________________________*/
/* Get some detail about the job to be executed. */
/*______________________________________________________________*/
JobInfo.lJobID = lJobID;
dbfcmd(dbprocJob, " SELECT"
" JobListName,"
" StepNum,"
" GrpName,"
" MachineName,"
SchedBy"
" from SSPendingJobTable"
" where JobRunID = %ld", lJobID);
dbsqlexec(dbprocJob);
dbresults(dbprocJob);
dbbind(dbprocJob, 1, NTBSTRINGBIND, sizeof(Joblnfo.szJobListName), JobInfo.szJobListName);
dbbind(dbprocJob, 2, SMALLBIND, sizeof(sStepNum), (PBYTE) &sStepNum);
dbbind(dbprocJob) 3, NTBSTRINGBIND, sizeof(Joblnfo.szGroupHame), Joblnfo.szGroupName);
dbbind(dbprocJob, 4, NTBSTRINGBIND, sizeof(Joblnfo.szMachineName), JobInfo.szMachineName);
dbbind(dbprocJob, 5, NTBSTRINGBIND, sizeof(Joblnfo.szSchedBy), Joblnfo.szSchedBy);
while (dbnextrow(dbprocJob) != NO MORE ROWS) ;
/*______________________________________________________________*/
/* Update the job status to "trying". */
/*______________________________________________________________*/
dbfcmd(dbprocJOb, " UPDATE SSPendingJobTable"
" SET CurrentStat = \"T\""
" WHERE JobRunID = %ld") lJobID);
dbsqlexec(dbprocJob);
dbresults(dbprocJob);
/*______________________________________________________________*/
/* Let another thread have the dbproc. */
/*______________________________________________________________*/
DosSemClear(&hsemSGL);
/*______________________________________________________________*/
/* Find a machine to execute the batchd job. */
/*______________________________________________________________*/
GetMachine(BuIADSNet, &JobInfo>;
/*______________________________________________________________*/
/* Get exclusive use of the dbproc. */
/*______________________________________________________________*/
DosSemRequest(&hsemSaL, SEM_INDEFINITE WAIT);
/*______________________________________________________________*/
/* If we couldn't find a machine, change the status to */
/* "group busy" and we'll try again during the next cycle. */
/*______________________________________________________________*/
if (uIADSNet == 0) C
dbfcmd(dbprocJob, " UPDATE SSPendingJobTable"
" SET CurrentStat = \"G\""
" WHERE JobRunID = Xld", a " AvailProgramFileName,"
" ArgumentList1,"
" ArgunentList2"
" FROM SSPendingJobTable p, SSJobStepTable s,"
" SSAvailProgramTable a"
" WHERE p.JobListName = s.JobListName"
AND s.ProgramName = a.ProgramName"
" AND p.JobRunID = Xld"
AND JobStepNum > StepNum"
" ORDER BY JobStepNun", lJobID);
dbsqlexec(dbprocJob);
dbresults(dbprocJob);
dbbind(dbprocJob, 1, SMALLBIND, sizeof(sStepNum), (PBYTE) &sStepNum);
dbbind(dbprocJob, 2, NTBSTRINGBIND, sizeof(szFileName), szFileName);
dbbind(dbprocJob, 3, NTBSTRINGBIND, sizeof(szArgListl), szArgListl);
dbbind(dbprocJob, 4, NTBSTRINGBIND, sizeof(szArgList2), szArgList2);
/*______________________________________________________*/
/* If there are no more job steps, reset the row count, */
/* decrement the job count for the machine, and update */
/* the status to "successful". */
/*______________________________________________________*/
if (dbnextrow(dbprocJOb) _= NO MORE ROILS) dbcmd(dbprocJob, "set rowcount 0");
dbsqlexec(dbprocJob);
dbresults(dbprocJob);
dbfcmd(dbprocJob, " UPDATE SSMachineTable"
" SET JobCnt = JobCnt - 1"
" WHERE MachineName = \"%s\"", Joblnfo.szMachineName);
dbsqlexec(dbprocJob);
dbresults(dbprocJob);
dbfcmd(dbprocJob, " UPDATE SSPendingJobTable"
" SET"
" CurrentStat = \"S\","
" ErxbateTime = getdate()"
" WHERE JobRunID = Xld", lJobID);
dbsqlexec(dbprocJob);
dbresults(dbprocJob);
DosSemClear(&hsemSaL);
break;
/* i f */
while (dbnextrow(dbprocJob) != NO MORE RODS) /*_________.____________________________________________*/
/* Reset the row count. */
/*______________________________________________________*/
dbcmd(dbprocJob, "set rowcount 0");
dbsqlexec(dbprocJob);
dbresults(dbprocJob);
/*______________________________________________________*/
/* Get the user request colurm tram the pending job */

/* table. */
/*______________________________________________________*/
dbfcmd(dbprocJob, " SELECT UserRqst"
" FROM SSPendingJobTable"
" WHERE JobRunID = %ld", lJobID);
dbsqlexec(dbprocJob>;
dbresults(dbprocJob);
dbbind(dbprocJob, 1, CHARBIND, sizeof(chUserRequest), &chUserRequest);
while (dbnextrow(dbprocJob) != NO MORE ROWS) ;
/*______________________________________________________*/
/* If there is a user request other than single step, */
/* set status to "waiting" and decrement the job count. */
/*______________________________________________________*/
if (chUserRequest !_ ' ' &8 chUserRequest !_ 'S') dbfcmd(dbprocJob, " UPDATE SSPendingJobTable"
" SET CurrentStat =
" WHERE JobRunID = %ld", lJobID);
dbsqlexec(dbprocJob);
dbresults(dbprocdob);
dbfcmd(dbprocJob, " UPDATE SSMachineTable"
" SET JobCnt = JobCnt - 1"
" WHERE M8Ch1neN8me = \"%S\"", JobInfo.szMachineName>;
dbsqlexec(dbprocJob);
dbresults(dbprocJob);
DosSemClear(&hsemSGL);
break;
/* if */
/*______________________________________________________*/
/* If the user request is "single step", set a flag. */
/*______________________________________________________*/
if (chUserRequest =_ 'S') fSingleStep = TRUE;
/*______________________________________________________*/
/* Update the pending job table with the current step. */
/*______________________________________________________*/
dbfcmd(dbprocJob, " UPDATE SSPendingJobTable"
" SET StepNum = Xd"
" WHERE JobRunIO = Xld", sStepNum, lJobID);
dbsqlexec(dbprocJob);
dbresults(dbprocJob);
/*______________________________________________________*/
/* Release the dbproc. */
/*______________________________________________________*/
DosSemClear(&hsemSOL);
/*______________________________________________________*/
/* Execute the program. */

/*______________________________________________________*/
ExecPkt.usRequest = ADSNET EXEC;
strcpy(ExecPkt.szProgram, szFileName);
strcpy(ExecPkt.szEncryptedArgs, szArgList2);
strcpy(ExecPkt.szArgs, szArgListl);
if (ADSNetWrite(uIADSNet, &ExecPkt, sizeof(ExecPkt))) dbfcmd(dbprocJob, " UPDATE SSPendingJobTable"
" SET"
" CUrrentStat = \"u\","
" StepNum = StepNum - 1"
" WHERE JobRunID = %ld") lJobID);
dbsqlexec(dbprocJob);
dbresults(dbprocJob);
dbfcmd(dbprocJob, " UPDATE SSMachineTable"
" SET JobCnt = JobCnt - 1"
" NHERE MaChineName = \"%S\"", JobInfo.szMachineName);
dbsqlexec(dbprocJob);
dbresults(dbprocJob>;
break;
/* i f */
if (ADSNetRead(uIADSNet, &RetExecPkt, sizeof(RetExecPkt), &cbBytesRead)) C
dbfcmd(dbprocJob, " UPDATE SSPendingJobTable"
" SET"
" CurrentStat = \"41\","
" StepNum = StepNum - 1"
" WHERE JobRunID = %ld", lJobID);
dbsqlexec(dbprocJob);
dbresults(dbprocJob);
dbfcmd(dbprocJob, " UPDATE SSMachineTable"
" SET JobCnt = JobCnt - 1"
WHERE MechineName = \"%S\"", Joblnfo.szMachineName);
dbsqlexec(dbprocJOb);
dbresults(dbprocJob);
break;
/* if */
/*______________________________________________________*/
/* Get exclusive use of the dbproc. */
/*______________________________________________________*/
DosSemRequest(&hsemSOL, SEM_INDEFINITE WAIT);
/*______________________________________________________*/
/* Update the job step result. */
/*______________________________________________________*/
dbfcmd(dbprocJob, " UPDATE SSPendingJobTable"
" SET StepResult = Xd"
" WHERE JobRunID = %ld", RetExecPkt.sRetCode, lJobID);

"~i ~'' r.
-154- a ~- ca dbsqlexec(dbprocJob);
dbresults(dbprocJob);
/*______________________________________________________*/
/* If error occurred on job step, update status. */
/*______________________________________________________*/
if (RetExecPkt.sRetCode != 0) C
dbfcmd(dbprocJob, " UPDATE SSPendingJobTable"
" SET"
" CurrentStat = \"E\","
" Erxb ateTime = getdate()"
" NHERE JobRunlD = %ld", lJobID);
dbsqlexec(dbprocdob);
dbresults(dbprocJob);
dbfcmd(dbprocJob, " UPDATE SSMachineTable"
" SET JobCnt = JobCnt - 1"
" WHERE MachineName = \"Y.s\"") Joblnfo.szMachineName);
dbsqlexec(dbprocJob);
dbresults(dbprocJob);
DosSemClear(8hsemSGL);
break;
/* i f */
/*______________________________________________________*/
/* Get the user request colurm from the pending job */
/* table. */
/*______________________________________________________*/
dbfcmd(dbprocJob, " SELECT UserRqst"
" FROM SSPendingJobTable"
" WHERE JobRunID = Xld", lJobID);
dbsqlexec(dbprocJob);
dbresults(dbprocJob);
dbbind(dbprocJob, 1, CHARBIND, sizeof(chUserRequest), &chUserRequest);
while (dbnextrow(dbprocJob) != NO MORE ROWS) ;
/*______________________________________________________*/
/* If the user request is set to "single step", but it */
/* was not set at the start of the step, pause at the */
/* end of the next step. If "single step" was set at */
/* the start of the step, but is now clear, just */
/* continue. */
/*______________________________________________________*/
if (fSingleStep) C
if (chUserRequest =_ 'S') dbfcmd(dbprocJob, " UPDATE SSPendingJobTable"
" SET"
" CUrrentStat = \"W\","
" UserRqst = \"H\""
" WHERE JobRunID = Xld", lJobID);
dbsqlexec(dbprocJob);
dbresults(dbprocJob);

dbfcmd(dbprocJob, " UPDATE SSMachineTable"
" SET JobCnt = JobCnt - 1"
" HHERE MachineName = \"°/aS\"", Joblnfo.szMachineName);
dbsqlexec(dbprocJob);
dbresults(dbprocJob);
DosSemClear(&hsemS~L);
break;
) /* if */
else fSingleStep = FALSE;
/* it */
/*______________________________________________________*/
/* Release the dbproc. */
/*______________________________________________________*/
DosSemClear(&hsemSGl);
/* for(;;) */
/*______________________________________________________________*/
/* Break the connection. */
/*______________________________________________________________*/
ADSNetDisconnect(uIADSNet);
/*______________________________________________________________x/
/* Update the internal job count. */
/*______________________________________________________________*/
DosSemRequest(8hsemJobCount, SEM_INDEFINITE WAIT);
usJobCount--;
DosSemClear(&hsemJobCount);
/*______________________________________________________________*/
/* End this thread. */
/*______________________________________________________________*/
_endthread();
/* Execute */
/*______________________________________________________________________*/
/* Find a machine to execute the batch job. */
/*______________________________________________________________________*/
VOID GetMachine(PULONG puIADSNet, PJOBINFO pJoblnfo) USHORT i;
USHORT usMachineCount = 0;
CHAR (*paszMachineNames)[MAX MACHINES)CMACHINENAMELENGTH);
/*______________________________________________________________*/
/* If the job already has a machine name, use it. This Would */
/* happen if a job was held during execution and then released. */
/*______________________________________________________________*/
if (pJobInfo->szMachineNameCO)) if (ADSNetConnect(puIADSNet, pJobInfo->szMachineName, ADSD_SERV1CE) _= 0) if (! Verify8atch(*puIADSNet, pJobInfo)) C
ADSNetDisconnect(*puIADSNet);
*puIADSNet = 0;
/* i f */
/* i f */
return;
/* i f */
/*______________________________________________________________*/
/* Allocate a buffer for the machine names. */
/*______________________________________________________________*/
if ((paszMachineNames = malloc(sizeof(*paszMachineNames))) _= NULL) s return;

/*______________________________________________________________*/

/* Get exclusive use of the dbproc. */

/*______________________________________________________________*/

DosSemRequest(&hsemSOL, SEM_IHDEFINITE WAIT);

/*______________________________________________________________*/

/* Get a list of machines for the specified */
group. Order the /* machines by the number of available jobs.*/

/*______________________________________________________________*/

dbfcmd(dbprocJob, " SELECT m.MachineName"

" FROM SSMachineTable m, SSGrpMachineTable g"

" NHERE m.MachineName = g.MachineName"

" AND g.GrpHame = \"Ys\" and m.JobCnt !=
m.MaxJobs"

" ORDER BY (m.MaxJobs - m.JobCnt) desc", pJoblnfo->szGroupName);

dbsqlexec(dbprocJob);

dbresults(dbprocJob);

dbbind(dbprocJob, 1, NTBSTRINGBIND, MACHINENAMELENGTH, (*paszMachineNames)I07);

while (dbnextrow(dbprocJob) != NO_MORE_ROWS) dbbind(dbprocJob, 1, NTBSTRINGBIND, MACHINENAMELENGTH, (*paszMachineNames)(++usMachineCount));

/* while */

/*______________________________________________________________*/

/* Let another thread have the dbproc. */

/*______________________________________________________________*/

DosSemClear(8hsemSGL);

/*______________________________________________________________*/

/* Try to find a machine to execute to job. */

/*______________________________________________________________*/

for (i = 0; i < usMachineCount; i++) C

if (ADSNetConnect(puIADSNet, (*paszMachineNames)Ii), ADSD SERVICE) _= 0) C

if (VerifyBatch(*puIADSNet, pJobInfo)) strcpy(pJobInfo->szMachineName, (*paszMachineNames)(i]);

break;

/* i f */

else C

ADSNetDisconnect(*puIADSNet);

*puIADSNet = 0;

/* else */

/* if */

/* for */

free(paszMachineNames);

return;

/* GetMachine */

/*-___________________________________________________________________-_*/

/* Ask the user if it's OK to execute on */
their machine.

/*______________________________________________________________________*/

BOOL VerifyBatch(ULONG uIADSNet, PJOBINFO
pJoblnfo) VERIFY PKT VerifyPkt;

RVERIFY PKT RetVerifyPkt;

USHORT cbBytesRead;

CHAR szJobStepIEXECUTEFILELENGTH + STEPARGSLENGTH7;

--i~~~

CHAR szArgListIISTEPARGSLENGTH1;
/*______________________________________________________________*/
/* Get exclusive use of the dbproc. */
/*______________________________________________________________*/
DosSemRequest(8hsemSOl, SEM-INDEFINITE WAIT);
/*______________________________________________________________*/
/* Set up the verify packet. */
/*______________________________________________________________*/
VerifyPkt.usRequest = AOSNET_VERIFY;
VerifyPkt.ulJobID = pJobtnfo->lJobID;
strcpy(VerifyPkt.szJobName, pJoblnfo->szJobListName);
strcpy(VerifyPkt.szScheduledBy, pJoblnfo->szSchedey);
/*______________________________________________________________*/
/* Send the verify packet. */
/*______________________________________________________________*/
ADSNetWrite(uIADSNet, BVerifyPkt, sizeof(VerifyPkt));
/*______________________________________________________________*/
/* Send the job steps. */
/*______________________________________________________________*/
dbfcmd(dbprocJob, " SELECT"
" AvailProgramFileName,"
" ArgumentListl"
" FROM SSPendingJobTable p, SSJobStepTable s, SSAvailProgramTable a"
" WHERE p.JobListName = s.JobListName"
and s.ProgramHame = a.ProgramName"
" and p.JobRunID = Xld"
" ORDER 8Y JobStepNum", pJobInfo->lJobID);
dbsqlexec(dbprocJob);
dbresults(dbprocJob);
dbbind(dbprocJob, 1, NTBSTRINGBIND, sizeof(szJobStep), szJobStep);
dbbind(dbprocJob, 2, NTBSTRINGBIND, sizeof(szArgListl), szArgt.istl);
while (dbnextrow(dbprocJOb) != NO MORE ROWS) strcat(szJobStep, " ");
strcat(szJobStep, szArgListt);
ADSNet4lrite(uIADSNet, szJobStep, strlen(szJobStep) + 1);
3 /* while */
/*______________________________________________________________*/
/* Signal end of job steps. */
/*______________________________________________________________*/
szJobStep(01 = 0;
ADSNetwrite(uIADSNet, szJobStep, 1);
/*______________________________________________________________*/
/* Let another thread have the dbproc. */
/*______________________________________________________________*/
DosSemClear(8hsemSGL);
~*______________________________________________________________*~
/* Read the return packet. */
/*______________________________________________________________*/
ADSNetRead(uIADSNet, BRetVerifyPkt, sizeof(RetVerifyPkt), 8cbBytesRead);
/*______________________________________________________________*/
/* Return with the result code. */
/*______________________________________________________________*/
return (RetVerifyPkt.sRetCode);

-lsa-/* VerifyBatch */
.************************x***********************************************
Copyright (c) 1990, 1991, 1992, 1993 American Airlines File: BATCHD.DEF
System: Batch Scheduler Description:
*******xx***********************x***************************************

~r*****************************************x************************x****
# Copyright (c) 1990, 1991, 1992, 1993 American Airlines #
# File: BATCHD.PMK
# System: Batch Scheduler # Description: Batch Scheduler Polymake file.
#,e*************x*********************x***********************x**********
CFLAGS+= -MT
OBJS= batchd.obj L18S= adsnet.lib ads. lib HEADERS= batchdef.h ALL: batchd.exe batchd.obj: L8(HEADERS)7 batchd.exe: E(OBJS) Lbatchd.def7 Xdo linkexe /******x*x*********x**************************x*********x**********x*****
* Copyright (c) 1990, 1991, 1992, 1993 American Airlines * File: BATCNDEF.H
x * System: Batch Administration x * Description:
*
*********x**xxxx*x***x**x***xx************xx*x**************x***********/
#define BATCHD SERVICE "batchd"
#define BATCHD_ACCEPT_NEHJOBS 1 #define BATCHD_REFUSE_NEWJOBS 2 #define BATCHD_OUERY_NEWJOBS 3 #define BATCHD STOP 4 #define RECURLENGTH 12 #define OATELENGTH 11 #define TIMELENGTH 9 i N~

#define EXECUTENAMELENGTH 26 #define EXECUTEFILELENGTH 251 #define EXECUTENUMBUTTONS 4 #define MACHINENAMELENGTH 16 #define MACHINEDESCLENGTH 81 #define MACHINEJOBSLENGTH 7 #define MACHINENUMBUTTONS 5 #define GROUPNAMELENGTH 26 #define GROUPDESCLENGTH 81 #define GROUPNUMBUTTONS 7 #define JOBNAMELENGTH 26 #define JOBDESCLENGTH 81 #define JOBEDITBYLENGTH 16 #define STEPNUMLENGTH 7 #define STEPPRGLENGTH 26 #define STEPARGSLENGTH 251 #define JOBLISTNUMBUTTONS 6 #define JOBSTEPNUMBUTTONS 6 #define JOBIDLENGTH 12 #define JOBDATELENGTH 31 #define PASSIlORDLENGTH 16 /************************************************************************
* Copyright (c) 1990, 1991) 1992, 1993 American Airlines * File: BATCHDLG.H
* System: Batch Administration * Description:
************************************************************************/
/* STRING IDS */
#define IDS BATCHBASE 32 #define IDS_ADMINTITLE IDS_BATCHBASE + 0 #define IDS_ANY IDS_BATCNBASE + 1 #define IDS_ASAP IDS_BATCHBASE + 2 #define IDS_ATTEMPTING IDS_BATCHBASE + 3 #define IDS BLANK IDS BATCHBASE + 4 #define IDS_CANCEL IDS_BATCHBASE + 5 #define IDS_CANT_LOGON IDS_BATCHBASE + 6 #define IDS_CANT_RESCHED IDS_BATCHBASE + 7 #define 1DS CANT START IDS_BATCHBASE + 8 #define IDS_CANT_STOP IDS_BATCHBASE + 9 #define IOS_CLIENT_LiST1_BOT IDS_BATCHBASE + 10 #define IDS_CLIENT_LIST1_TOP IDS_BATCHBASE + 11 #define IDS_ERASE IDS_BATCHBASE + 12 #define IDS_ERASE_JOB IDS_BATCHBASE + 13 #define IDS_ERASE_RUN ID5_BATCHBASE + 14 #define IDS_ERROR IDS_BATCHBASE ; 15 #define IDS EXECUTE_LIST1_BOT IDS BATCHBASE + 16 #define IDS_EXECUTE_LIST1_TOP IDS_BATCHBASE + 17 #define IDS_GROUP_BUSY IDS_BATCHBASE + 18 #define IDS_GROUP_LIST1_BOT IDS_BATCHBASE + 19 #define IDS_GROUP_L1ST1_TOP IDS_BATCHBASE + 20 #define IDS_GROUP_LIST2_BOT IDS_BATCHBASE + 21 #define 1DS GROUP LIST2 TOP 1DS BATCHBASE + 22 #define 1DS GROUP LIST3 BOT IDS_BATCHBASE + 23 #define IDS GROUP LIST3 TOP IDS BATCHBASE + 24 #defineIDSHOLD IDSBATCHBASE+

#defineIDS_ITEM_BUSY IDSBATCHBASE+

#defineIDS_JOB _ BATCHBASE+

#defineIDS_JOBLIST_LIST1_ BATCNBASE+

#defineIDS__ _ BATCHBASE+

TOP

#defineIDS__ _ BATCHBASE+
_ IDS 30 JOBSTEP_LIST1 BOT

#defineIDS_ _ BATCHBASE+

TOP

#define_ _ _ BATCHBASE+
IDS__ IDS 32 JOB_ID

#defineIDSJOB _ BATCHBASE+

#define_ _ _ BATCHBASE+
IDS_JOB IDS 34 NOT
REMOVED

#defineIDS__ _ BATCHBASE+
_ IDS 35 JOB
STEPS

#defineIDS__ _ BATCHBASE+

BOT

#defineIDS_ _ BATCHBASE+
_ IDS 37 MACHINES

TOP

#define_ _ _ BATCHBASE+
IDS__ IDS 38 SHORT

#defineIDS_ _ BATCHBASE+

NOVERIFY

#define_ _ _ BATCHBASE+

DAY

#defineIDS_ _ BATCHBASE+
_ IDS 41 NEED
MONTH

#defineIDS_ _ BATCHBASE+
_ tDS 42 _NO
DATE

#defineIDS_ _ BATCHBASE+

GROUP

#define_ _ _ BATCHBASE+
IDS_NO_GROUP IDS 44 SELECTED

#defineIDS_ _ BATCHBASE+

HELP

#define_ _ _ BATCHBASE+
IDS_NO_J08 IDS 46 #defineIDSNO _ BATCHBASE+

SELECTED

#define_ _ _ BATCHBASE+
IDS__ IDS 48 PICKSERV

BOT

#defineIDS_ _ BATCHBASE+
_ IDS 49 PICKSERV

TOP

#define_ _ _ BATCHBASE+
IDS_ IDS 50 RESCHEDULE

#defineIDSRESUME _ BATCHBASE+

BOT

#define_ _ _ BATCHBASE+
IDS_ IDS 52 RESUME

TOP

#define_ _ _ BATCHBASE+
IDS_ IDS 53 RUNNING

#define_ RUSH _ BATCHBASE+
IDS_ IDS 54 #defineIOSSCHEDULE _ BATCHBASE+

#define_ SCHPL1D_SHORT_ BATCHBASE+
IDS_ IDS 56 #defineIDSSCH _ BATCHBASE+

#define_ _ IDSBATCHBASE+

REJECTED

#define_ _ _ BATCHBASE+

#define_ SUCCESS _ BATCHBASE+
IDS_ IDS 60 #defineIDSTIME _ BATCHBASE+

#define_ _ IDS_ +
IDS_T00_LONG BATCHBASE62 #defineIDSUSERTITLE IDS_ +

#define_ _WAITING IDS_ +
IDS _BATCHBASE64 #defineIDSWARNING IDSBATCHBASE+

#define_ IDS_ +
IDS_WORKSTATION BATCHBASE66 #defineIDSWRONG IDS_ +

#define_ IDS_ +
_ _BATCHBASE68 IDS_MACHINE_UNAVAIL

#defineIDSNEED PERIOD IDSBATCHBASE+

#include ~~bamenu.h~~
#define ID_CLIENT_HEADING 80 #define ID CLIENT ADSLIST 81 /* TABLES
HELPand SUBTABLES
*/

#definetD_HELPTABLE 82 #defineiD_BA_MAIN_HELP 83 #defineID_BAEXECUTE 84 HELP

#defineID_ _ 85 _BA_MACHINES_HELP

#defineID_BA_GROUPS_HELP 86 #defineID_8A_JOBLIST_HELP 87 #defineID_BA_JOBSTEP_HELP 88 #defineID_BA_ZOOM_HELP 89 #defineID_BA_FILTER 90 HELP

#defineID_BA__ 91 RESUME_HELP

#defineID_BA_DAYTIMER_HELP92 #defineID_BA_PNDENTER_HELP93 #defineIDBAP11DSET HELP 94 r) ~~ ~ r~ .~_ ~ r~

/* HELP PANELS */
#defineIDH_BA_MAIN_EXTENDED1 #defineIDH_BA_EXECUTE_EXTENDED2 #defineIDH_BA_MACHINES_EXTENDED3 #defineIDH_BA_GROUPS 4 EXTENDED

#defineIDH_BA_ 5 _JOBLIST_EXTENDED

#define1DHBAJOBSTEP EXTENDED6 #defineIDH_BA_200M_EXTENDED7 #defineIDH_BA_FILTER 8 EXTENDED

#defineIDH_BA_ 9 _RESUME_EXTENDED

#defineIDH_BA_DAYTIMER_EXTENDED10 #defineIDH_BA_PNDENTER_EXTENDED11 #define1DH_BA_PI~IDSET_EXTENDED12 #defineIDH_BA_HELP 13 #defineIDHBAHEL 14 HFH

#defineIDH_ _ 15 _BA_ _HEL_SC_HELPEXTENDED

#defineIDHBAHEL 16 SC
HELPKEYS

#defineIDH_ _ 17 _BA_ _ _HEL_SC_HELPINDEX

#defineIDHBAHEL ABOUT 18 /* CLIENT WND PROC BUTTONS */
#define USRBTN BASE 200 #define ID_CLIENT_MGLASS USRBTN_BASE + 0 #define ID_CLIENT_SCHED USRBTN_BASE + 1 #define 1D CLIENt GOLIGHT USRBTN_BASE + 2 #define ID_CLIENT_STOPLIGHT USRBTN_BASE + 3 #define ID_CLIENT_RESCHED USRBTN_BASE + 4 #define ID_CLIENT_RUSH USRBTN_BASE + 5 #define ID CLIENT ERASER USRBTN BASE + 6 /************************************************************************
* Copyright (c) 1990, 1991, 1992, 1993 American Airlines * File: BATCHSTR.H
* System: Batch Administration * Description:
******************************************************************x*****/
STRINGTABLE
BEGIN
IDS_ADMINTITLE "Batch Administration"
IDS_ANY "ANY"
IDS_ASAP "ASAP"
IDS ATTEMPTING "Attempting"
IDS_BLANK " "
IDS_CANCEL "Cancel"
IDS_CANT_LOGON "LOGON Record not obtained!"
IDS_CANT_RESCHED "Can't reschedule a RUNNING batch!"
IDS_CANT_START "The Scheduler is running and must be stopped first!"
IDS_CANT_STOP "The Schedule Server can not be shutdown while batches are running "
I D S _ C L I E N T _ L I S T 1 _ B 0 T
"ID\011Name\011Request\011Status\011Scheduled\011Group\011By"
I D S _ C L I E N T _ L I S T 1 _ T 0 P
"Batch\011Batch\011User\011Current\011Run\011Target\011Scheduled"
IDS_ERASE "ERASE?"
IDS_ERASE_JOB "Erase batch #"
IDS_ERASE_RUN "is currently running.\n TERMINATE and ERASE the batch?"
IDS ERROR "ERROR"

~~ ~ ~~~:~_~"~

IDS_EXECUTE_LIST1_BOT "Name\011Name"
IDS EXECUTE LIST1-TOP "Program\011Fi1e"
IDS_GROUP_BUSY "Group Busy"

IDS_GROUP_LIST1_BOT"Name\011Description"

IDS_GROUP_LIST1_TOP"Group\011Group"

IDS_GROUP_LIST2_BOT"Name\011Description"

IDS_GROUP_LIST2_TOP"Workstation\011Workstation"

IDS_GROUP LIST3_BOT"Name\011Description"

IDS_GROUP LIST3"Workstation\011Workstation"
TOP

IDS_HOLD "Hold"

IDS_ITEM_BUSY "The item you selected was busy.
Try again."

IDS_JOB "Batch"

IDS_JOBLIST_LIST1_BOT"Name\011Description\011By\011Modified"

IDS_JOBLIST_LIST1_TOP"Batch\011Batch\011Edited\011Date"

IDS_JOBSTEP "Nun\011Name\011List"
LIST1_BOT

IDS_JOBSTEP "Job\011Program\011Parameter"

IDS_JOB_ID "Batch Id"

IDS_JOB_NAME "Batch Name"

IDS_JOB_NOT_REMOVED"Your original batch was not removed!"

IDS_JOB_STEPS "Batch Jobs in"

IDS_MACHINES_LIST1"Name\011Batch\011Description"
BOT

IDS_MACHINES_LIST1"Workstation\011Max\011Workstation"
TOP

IDS_MODPWD_SHORT"The modify password must be at least 6 characters long."

IDS_MOD_NOVERIFY"The modify password can not be verified."

IDS NEED DAY "Please indicate what DAY this batch should be rescheduled for!"

IDS_NEED MONTH "At least one MONTH must be chosen to reschedule this batch!

IDS NEED PERIOD"At least one PERIOD must be chosen to reschedule this batch!' IDS_NO_DATE "Please enter the RUN DATE!"

IDS_NO_GROUP "Group not selected"

IDS NO GROUP "Please identify the GROUP that SELECTED you would like this batch to execute on!'~

IDS_HO_HELP "The Help file was not found."

IDS_NO_JOB "Batch not selected"

IDS NO JOB SELECTED"Please identify the BATCH that you would like to schedule!

IDS_PICKSERV_LIST1_BOT"Name\011Description"

IDS_PICKSERV_LIST1-TOP"Workstation\011Workstation"

IDS_RESCHEDULE "Edit Selected Schedule"

IDS_RESUME_LIST1"Num\011Neme\011List"
BOT

IDS_RESUME_LIST1"Job\011Program\011Parameter"
TOP

IDS_RUNNING "Running"

IDS_RUSH "RUSH"

IDS_SCHEDULE "Schedule Batch Execution"

IDS SCHP4iD "The scheduling password must be SHORT at least 6 characters long.

IDS_SCH_NOVERIFY"The schedule password can not be verified."

IDS SGL_REJECTED"This batch has been rejected by the database. Please verifythe time given!"
and dates IDS_STEP "Job"

IDS_SUCCESS "Success"

IDS_TiME_INCORRECT"Please enter a valid TIME!"

IDS_T00_LONG "The combined parameter lists are too long. Try again."

IDS_USERTITLE "Batch"

IDS_WAITING "Waiting"

IDS_WARNING "WARNING!"

IDS_WORKSTATION "Workstations in"

IDS_WRONG_PASSHORD"The PASSWORD that you entered was incorrect!"

IDS_MACHINE_UNAVAIL"The selected machine is not available!"

END

~*************************************x********************x*************
* Copyright (c) 1990, 1991, 1992, 1993 American Airlines #defineDID_DAYTIMER_NOV 1136 #defineDID_DAYTIMER_DEC 1137 #defineOID_DAYTIMER_ALL 1138 #defineDID_DAYTIMER_PERIOD11140 #defineDID_DAYTIMER_PERIOD21141 #defineDID_DAYTIMER_PERIOD31142 #defineDID_DAYTIMER_PERIOD41143 #defineDID_DAYTIMER_PERIODS1144 #defineDID_DAYTIMER_PERIOD61145 #defineDID_DAYTIMER_PERIOD71146 #defineDID_DAYTIMER_PERIOD81147 #defineDID_DAYTIMER_PERI0091148 #defineDID_DAYTIMER_PERIOD101149 #defineDID_DAYTIMER_PERIOD111150 #defineDID_DAYTIMER_PERIOD121151 #defineDID_DAYTIMER_PERIOD131152 #defineDID_DAYTIMER_PERIODICALLY1153 #defineRBID_MONTH 1154 #defineRBID_PERI00 1155 #defineSTID_DAY 1156 OFFSET

#definePBID 1157 #defineIDD_EXECUTE 1200 #defineDID_EXECUTE_HEADING1201 #detineDID_EXECUTE_ADSLIST1202 #defineDID_EXECUTE_PROGFILE1203 #defineDID_EXECUTE_PROGNAME1204 #defineDID_EXECUTE_CLEAR1205 #defineDID_EXECUTE_INSERT1206 #defineDID_EXECUTE_UPDATE1207 #defineOIDEXECUTE DELETE1208 #defineIDD_FILTER 1300 #defineDID_FILTER_JOBCOM801301 #defineDID_F1LTER_JOBCLEAR1302 #defineDID_FILTER_BYCOMBO1303 #defineDID_FILTER_BYCLEAR1304 #defineDID_FILTER_GROUPCOMBO1305 #defineDID_FILTER_GROUPCLEAR1306 #defineDID_FILTER_START 1307 #defineDIDFILTER END 1308 #defineIDD_GROUPS 1400 #defineIDD_GROUPS_LIST 1401 #defineIDD_GROUPS_MOOIFY1402 #defineIDD_GROUPS_DELETE1403 #defineIDD_GROUPS_CANCEL1404 #defineIDD_GROUPS_HELP 1405 #defineIDDGROUPS LISTHEADER1406 #defineIDD_JOBLIST 1500 #defineDID_JOBL1ST_HEADING1501 #defineDID_JOBL1ST_ADSLIST1502 #defineDID_JOBL(ST_JOBNAME1503 #defineDID_JOBLIST_JOBDESC1504 #defineDID_JOBLIST_CLEAR1505 #defineDID_JOBLIST 1506 INSERT

#defineDID_ 1507 _JOBLIST_CLONE

#defineD1D_JOBLIST 1508 DELETE

#defineDID_ 1509 JOBLIST MODIFY

#defineIDD_JOBSTEP 1600 #defineDID_JOBSTEP_HEADING1601 #defineDID_JOBSTEP_ADSLIST1602 #defineDID_JOBSTEP_COMBO1603 #defineDIDJOBSTEP ARGS1 1604 ~~ .e.. 9 #defineDID_JOBSTEP_ARGS2 1605 #defineDID_JOBSTEP_RESTRICT11606 #defineDID_JOBSTEP_RESTRICT21607 #defineDID_JOBSTEP_CLEAR 1608 #defineDID_JOBSTEP_APPEND1609 #defineDID_JOBSTEP_INSERT1610 #defineDtD_JOBSTEP_UPDATE1611 #defineDID_JOBSTEP_DELETE1612 #defineDIDJOBSTEP PASSNORDS1613 #defineIDD_MACHINES 1700 #defineIDD_MACHINES 1701 LIST

#defineIDD__ 1702 MACHINES
MODIFY

lfdefineIDD__ 1703 MACHINES_DELETE

#defineIDD_MACHINES_CANCEL1704 #defineIDD_MACHINES_HELP 1705 #defineIDDMACHINES LISTHEADER1706 #defineIDI_SERVER 17 #defineIDD_PICKSERV 1800 #defineDID_PICKSERV 1801 HEADiNG

#defineDID_ 1802 PICKSERV ADSLIST

#defineIDD_P41DENTER 1900 #defineDiDPbIDENTER ENT11901 #defineIDD_PLIDSET 2000 #defineDID_P~1DSET_ENT1 2001 #defineDID_P~1DSET 2002 #defineDID__ 2003 PWDSET_ENT3 #defineDIDPHDSET ENT4 2004 #defineIDI_GOLIGHT 4 #defineIDD_RESUME 2100 #defineDIDRESUME 2101 STEPOUT

#defineDID_ 2102 _ _RESUME_RETURNCDDE

#defineDID_RESUME_NEXTSTEP2103 #defineDID_RESUME_MACHINE2104 #defineDIDRESUME 2105 ANYINGROUP

#defineDID_ 2106 _ _RESUME_HEADING

ttdefineDID_RESUME_ADSLIST2107 #defineDIDRESUME STEP 2108 #defineIDI_MGLASS1 2 #defineIDD_200M 2200 #defineDID_ZOOM_USERREO 2201 #defineDID_ZOOM STATUS 2202 #defineDID_ZOOM_STEPNUM 2203 #defineDID_ZOOM 2204 STEPRESULT

#defineDID_ 2205 _ZOOM_GRPNAME

#defineDIDZOOM MACHINENAME2206 #defineDID_ZOOM_STARTTIME2207 #defineD1D_ZOOM_ENDTIME 2208 #defineDID_ZOOM_NEXTRUN 2209 #defineDID_ZOOM_SUN 2210 #defineDID_ZOOM_MON 2211 #defineDID_ZOOM TUE 2212 #defineDID_ZOOM_WED 2213 #defineDID_ZOOM_THU 2214 #defineDID_ZOOM_FRI 2215 #defineDID_ZOOM_SAT 2216 #defineDID_ZOOM MONTNDAY2217 #defineDID_ZOOM_JAN 2218 #defineDID_200M_FEB 2219 #defineDID_ZOOM_MAR 2220 #defineDIDZOOM APR 2221 _~ ~~°~ ~.~~~

#define DID_ZOOM_MAY2222 #define DID_ZOOM_JUN2223 #define DID_ZOOM_JUL2224 #define DID_ZOOM_AUG2225 #define D1D_ZOOM_SEP2226 #define DID_ZOOM_OCT2227 #define DID_ZOOM_NOV2228 #define DID_ZOOM_DEC2229 ~fdefine DID_ZOOM_SCHEDBY2230 #define DID_ZOOM_1 2232 #define DID ZOOM 2233 Itdefine DID_ZOOM_32234 #define DID 200M 2235 #define DID_ZOOM_5 2236 #define DID_ZOOM_6 2237 #define DID_ZOOM_7 2238 #define DID ZOOM 2239 #define DtD_ZOOM_9 2240 #define D1D ZOOM 2241 #define DID_200M_112242 #define D1D ZOOM 2243 #define D1D_ZOOM_132244 #define D1D ZOOM 2245 PMOFFSET

Batch scheduling system 160 provides means for generating a variety of customized reports automatically at end-user predetermined times and intervals.
Batch scheduling system 160 allows each batch executable filename or program filename to be assigned a program name as further illustrated by the screen shown 5 in FIGURE 4. Another feature of batch scheduling system 160 is the ability to edit batches 232 to add, modify, delete or copy jobs within a batch.
Additionally, batch scheduling system 160 gives the user the ability to define executable programs 234 that may be batch processed, i.e. to give the end user the ability to customize reports and decide what parameters should be used 10 and when and where the batches should be processed. An example of this is illustrated in the screen of FIGURE 5.

y'~ .d f.~ ~ ~ !) t"'~
:;.1 ,r. .d w .~. ~~

Batch scheduling system 160 provides the end user with the ability to view current batch detail, batch status, and batch history 240 as needed. Feature illustrated in the screen shown in FIGURE 6.
Batch scheduling system 160 gives the user the ability to assign available resources to resource groups 238 (used during the batch processing). This allows the end user to decide, if, when and how many of the resources within the end-user facility shall be used for customized report generation and when those resources are going to be occupied. Batch scheduling system 160 also has the ability to add resources 236 to those that are available for batch processing.
This gives flexibility to the end-user to either increase or decrease the number of resources utilized in report generation and customization. Features 236 and are also illustrated in the screen of FIGURES 7 and FIGURE 8, respectively .
Operation of the batch scheduling system 160 is illustrated at 250, 260, 270, 280 of FIGURE 3 with the start of the batch scheduler on either LAN 50 or a single platform attached to LAN 50. Batch scheduling system 160 may execute tasks 260 on the preassigned resources 238 which have been added to the list of resources 236 using the available processing power of LAN 50 to start the scheduled batch process 250. After a job is completed, batch scheduling system 160 then transmits the data along communication line 262 to database server 80.
Batch job information is communicated along the line 264 from the accounting and reporting database 150 to the start batch scheduler 250. Two other functions .a c x .'i ~ ~ .. a J

270 and 280 allow the batch scheduling system 160 to refuse or accept new jobs while the scheduler is running or to stop and start the batch scheduler as necessary. One embodiment of features 270 and 280 is illustrated in the screen of FIGURE 7.
Although the invention has been described and illustrated in detail it is clearly understood that the same is by way of illustration and example only.
It is not to be taken by way of limitation. The scope of the present invention is to be limited only by the terms of the appending claims.

Claims (9)

1. A system for batch processing of travel-related reservation data comprising:
a centralized reservation system;
a plurality of processing resources communicably linked to the centralized reservation system and configured to perform a plurality of back-office functions;
a batch task scheduling function interfaced to the plurality of processing resources for scheduling batch tasks; and a batch task distribution function coupled to the batch task scheduling function and interfaced to the plurality of processing resources for partitioning the batch tasks among said plurality of processing resources.
2. The system recited in claim 1 further comprising a client server platform communicably linked to the centralized reservation system and providing a communication link between the centralized reservation system and a plurality of end users.
3. A system for scheduling batch tasks which control the processing of travel transactions, comprising:
a client server platform;
a local area network coupled to the client server platform;
a plurality of processing resources coupled to the local area network and providing a plurality of back-office system transactions applications;
a batch task scheduling function controllably interfaced to the plurality of processing resources for scheduling the generation of reports;
and a batch task distribution function coupled to the batch task scheduling function and controllably interfaced to the plurality of processing resources for partitioning the batch tasks among said plurality of processing resources.
4. A method of scheduling the batch processing of travel-related reservations with back office applications of the travel providers local processing resources, comprising:
initiating a communications link with a central reservation system having a mass data base containing a plurality of travel-related reservation data;
requesting travel-related reservation data from the central reservation system via the communications link;
using the local processing resources to process the data received from the central reservation system;
scheduling a batch task to process the data; and distributing the batch task among the local processing resources for processing at a predetermined time.
5. A system for processing travel reservation transactions on a batch driven basis comprising:
a centralized reservation system containing airline reservation information; and a plurality of processing resources communicably linked to the centralized reservation system and containing a plurality of back-office applications wherein at least one of the back-office application comprises:
a batch scheduling function interfaced to the plurality of processing resources for scheduling periodic processing of reservation transaction data;
and a batch task distribution function coupled to said batch scheduling function and interfaced to the plurality of processing resources for partitioning the periodic processing of said reservation transaction data among said plurality of processing resources.
6. The system recited in claim 1 further comprising a printing means coupled to at least one of the plurality of processing resources for generating reports.
7. A system for scheduling batch tasks that control the processing of travel-related transactions comprising:
a client server platform;
a local area network coupled to the client server platform;
a plurality of processing resources coupled to said local area network and providing a plurality of back-office transaction applications;
a batch scheduling function interfaced to said plurality of processing resources for scheduling the processing of the travel-related transactions using batch tasks; and a batch task distribution function coupled to said batch scheduling function and interfaced to said plurality of processing resources for partitioning said batch tasks among said plurality of processing resources, said batch tasks causing the processing of said travel-related transactions at some predetermined time.
8. The system according to claim 3 further comprising a printing means coupled to at least one of said plurality of processing resources for generating reports.
9. The method according to claim 4 further comprising the step of printing reports from the processed travel-related reservation data.
CA002137167A 1993-12-22 1994-12-02 Data management method and architecture Expired - Lifetime CA2137167C (en)

Applications Claiming Priority (2)

Application Number Priority Date Filing Date Title
US17204693A 1993-12-22 1993-12-22
US08/172,046 1993-12-22

Publications (2)

Publication Number Publication Date
CA2137167A1 CA2137167A1 (en) 1995-06-23
CA2137167C true CA2137167C (en) 1999-09-21

Family

ID=22626140

Family Applications (1)

Application Number Title Priority Date Filing Date
CA002137167A Expired - Lifetime CA2137167C (en) 1993-12-22 1994-12-02 Data management method and architecture

Country Status (6)

Country Link
US (1) US5764981A (en)
EP (1) EP0660251B1 (en)
AT (1) ATE228678T1 (en)
CA (1) CA2137167C (en)
DE (1) DE69431784T2 (en)
ES (1) ES2190785T3 (en)

Families Citing this family (60)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP3756954B2 (en) * 1995-07-11 2006-03-22 株式会社 日立製作所 Service provision system
US5644721A (en) * 1995-08-30 1997-07-01 System One Information Management, L.L.C. Multiple currency travel reservation information management system and method
US7050986B1 (en) 1995-09-06 2006-05-23 The Sabre Group, Inc. System for corporate traveler planning and travel management
SG43400A1 (en) * 1995-09-06 1997-10-17 Sabre Group Inc System for corporate travel planning and management
US6442526B1 (en) 1995-09-06 2002-08-27 The Sabre Group, Inc. System for corporate travel planning and management
US5845257A (en) * 1996-02-29 1998-12-01 Starfish Software, Inc. System and methods for scheduling and tracking events across multiple time zones
US6229534B1 (en) 1998-02-27 2001-05-08 Sabre Inc. Methods and apparatus for accessing information from multiple remote sources
US6772131B1 (en) * 1999-02-01 2004-08-03 American Management Systems, Inc. Distributed, object oriented global trade finance system with imbedded imaging and work flow and reference data
US7016857B1 (en) 1999-03-19 2006-03-21 Advanced Network And Database Systems Method and device implementing a seamless user/service reservation network
US9208213B2 (en) * 1999-05-28 2015-12-08 Microstrategy, Incorporated System and method for network user interface OLAP report formatting
US6434533B1 (en) 1999-10-27 2002-08-13 Market Data Systems, Inc. Method for the exchange, analysis, and reporting of performance data in businesses with time-dependent inventory
US8788308B1 (en) * 2004-03-29 2014-07-22 West Corporation Employee scheduling and schedule modification method and apparatus
FI19992495A (en) * 1999-11-23 2001-05-24 Sonera Oyj ticket System
SG83190A1 (en) * 2000-02-21 2001-09-18 Cmc Magnetics Corp Method and system of processing the inquiry and booking procedures for carriage
US10142836B2 (en) 2000-06-09 2018-11-27 Airport America, Llc Secure mobile device
US7599847B2 (en) 2000-06-09 2009-10-06 Airport America Automated internet based interactive travel planning and management system
US6606529B1 (en) * 2000-06-09 2003-08-12 Frontier Technologies, Inc. Complex scheduling method and device
US6928482B1 (en) 2000-06-29 2005-08-09 Cisco Technology, Inc. Method and apparatus for scalable process flow load balancing of a multiplicity of parallel packet processors in a digital communication network
US7315567B2 (en) * 2000-07-10 2008-01-01 Motorola, Inc. Method and apparatus for partial interference cancellation in a communication system
US7275038B1 (en) * 2000-08-18 2007-09-25 The Crawford Group, Inc. Web enabled business to business operating system for rental car services
US8600783B2 (en) 2000-08-18 2013-12-03 The Crawford Group, Inc. Business to business computer system for communicating and processing rental car reservations using web services
US7899690B1 (en) 2000-08-18 2011-03-01 The Crawford Group, Inc. Extended web enabled business to business computer system for rental vehicle services
US7876748B1 (en) 2000-09-07 2011-01-25 International Business Machines Corporation Stable hash-based mapping computation for a dynamically varying target set
WO2002031711A1 (en) * 2000-10-10 2002-04-18 T & M Consulting Gmbh Program logic for selling authorizations
US20020103693A1 (en) * 2001-01-30 2002-08-01 Horst Bayer System and method for aggregating and analyzing feedback
CA2443959A1 (en) 2001-04-20 2002-10-31 American Express Travel Related Services Company, Inc. System and method for travel carrier contract management and optimization
GB2376542B (en) * 2001-06-15 2005-06-29 Ibm A method and system for scheduling execution of activities
US6931399B2 (en) * 2001-06-26 2005-08-16 Igougo Inc. Method and apparatus for providing personalized relevant information
WO2003005161A2 (en) * 2001-07-02 2003-01-16 American Express Travel Related Services Company, Inc. System and method for airline purchasing program management
US7539620B2 (en) * 2002-07-02 2009-05-26 American Express Travel Related Services Company, Inc. System and method for facilitating transactions among consumers and providers of travel services
US20040260581A1 (en) * 2001-08-23 2004-12-23 American Express Travel Related Services Company, Inc. Travel market broker system
US7499864B2 (en) * 2002-01-25 2009-03-03 American Express Travel Related Services Company, Inc. Integrated travel industry system
US20050288974A1 (en) * 2001-08-23 2005-12-29 American Express Travel Related Services Company, Inc. Travel service broker system and method
US7822679B1 (en) * 2001-10-29 2010-10-26 Visa U.S.A. Inc. Method and system for conducting a commercial transaction between a buyer and a seller
US7805323B2 (en) * 2002-01-25 2010-09-28 American Express Travel Related Services Company, Inc. System and method for processing trip requests
CA2424399A1 (en) * 2002-04-04 2003-10-04 Build-A-Bear Workshop, Inc. Electronic meeting management system and an associated method of scheduling meetings
US7158939B2 (en) * 2002-06-07 2007-01-02 Hadera, L.L.C. Method and system for improved reporting of issued travel tickets
US8108231B2 (en) 2002-06-14 2012-01-31 The Crawford Group, Inc. Method and apparatus for improved customer direct on-line reservation of rental vehicles
US20040039612A1 (en) 2002-06-14 2004-02-26 Neil Fitzgerald Method and apparatus for customer direct on-line reservation of rental vehicles
US7668744B2 (en) * 2003-07-31 2010-02-23 The Boeing Company Method and system for conducting fleet operations
US20060069717A1 (en) * 2003-08-27 2006-03-30 Ascential Software Corporation Security service for a services oriented architecture in a data integration platform
US20050222931A1 (en) * 2003-08-27 2005-10-06 Ascential Software Corporation Real time data integration services for financial information data integration
US20050240354A1 (en) * 2003-08-27 2005-10-27 Ascential Software Corporation Service oriented architecture for an extract function in a data integration platform
US20060010195A1 (en) * 2003-08-27 2006-01-12 Ascential Software Corporation Service oriented architecture for a message broker in a data integration platform
US20090007132A1 (en) * 2003-10-03 2009-01-01 International Business Machines Corporation Managing processing resources in a distributed computing environment
US20050198469A1 (en) * 2003-11-12 2005-09-08 Brian Mitchell Parallel execution optimization method and system
US20050165628A1 (en) * 2004-01-27 2005-07-28 Carmen Systems Ab Method and system for rescheduling passengers
US7548615B2 (en) * 2004-04-28 2009-06-16 American Express Travel Related Services Company, Inc. Rate validation system and method
US7021532B2 (en) * 2004-06-02 2006-04-04 American Express Travel Related Services Company, Inc. Transaction authorization system and method
US8645253B2 (en) * 2005-04-05 2014-02-04 Thomson Reuters (Markets) Llc Method and system for generating a valuation metric based on growth data factors
US8271309B2 (en) 2006-03-16 2012-09-18 The Crawford Group, Inc. Method and system for providing and administering online rental vehicle reservation booking services
US20080097798A1 (en) * 2006-10-18 2008-04-24 The Crawford Group, Inc. Method and System for Creating and Processing Rental Vehicle Reservations Using Vouchers
US8160906B2 (en) * 2006-12-12 2012-04-17 The Crawford Group, Inc. System and method for improved rental vehicle reservation management
US8160907B2 (en) * 2007-07-25 2012-04-17 The Crawford Group, Inc. System and method for allocating replacement vehicle rental costs using a virtual bank of repair facility credits
US20090222818A1 (en) * 2008-02-29 2009-09-03 Sap Ag Fast workflow completion in a multi-system landscape
US8990820B2 (en) * 2008-12-19 2015-03-24 Microsoft Corporation Runtime task with inherited dependencies for batch processing
US8281309B2 (en) * 2009-08-31 2012-10-02 Accenture Global Services Limited Optimization system for controlling batch job processing traffic transmitted to a mainframe computer
CN103294774B (en) * 2013-05-10 2016-08-24 中国工商银行股份有限公司 The device and method carrying out data warehouse loading in batches based on zone
FR3071335B1 (en) * 2017-09-20 2022-11-25 Bull Sas METHOD AND SYSTEM FOR OPTIMIZING THE SCHEDULING OF BATCH PROCESSES
CN117408642B (en) * 2023-12-12 2024-03-19 浙江美云数据科技有限公司 Rural digital service management platform based on artificial intelligence

Family Cites Families (25)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US3622995A (en) * 1969-03-21 1971-11-23 Burroughs Corp Automatic ticket/credit card check-in system
US3705384A (en) * 1971-08-10 1972-12-05 Eric C Wahlberg Business transaction apparatus
US3872448A (en) * 1972-12-11 1975-03-18 Community Health Computing Inc Hospital data processing system
GB1504112A (en) * 1976-03-17 1978-03-15 Ibm Interactive enquiry systems
IT1081009B (en) * 1977-06-30 1985-05-16 Amf Sasib AUTOMATIC ELECTRONIC DEVICE FOR THE FORMULATION AND PRINTING OF TRAVEL TICKETS, IN PARTICULAR RAILWAYS
US4449186A (en) * 1981-10-15 1984-05-15 Cubic Western Data Touch panel passenger self-ticketing system
EP0082225B1 (en) * 1981-12-23 1987-05-06 International Business Machines Corporation Business system
US4788643A (en) * 1983-08-29 1988-11-29 Trippe Kenneth A B Cruise information and booking data processing system
JPS61256472A (en) * 1985-05-10 1986-11-14 Japanese National Railways<Jnr> Terminal system for issuing credit settling ticket
US4775936A (en) * 1986-03-31 1988-10-04 Jung Jerrold M Overbooking system
US4812968A (en) * 1986-11-12 1989-03-14 International Business Machines Corp. Method for controlling processor access to input/output devices
US4862357A (en) * 1987-01-28 1989-08-29 Systemone Holdings, Inc. Computer reservation system with means to rank travel itineraries chosen in terms of schedule/fare data
US4922439A (en) * 1987-05-20 1990-05-01 Nathan Greenblatt Operational system for travel agents
US4958280A (en) * 1987-07-10 1990-09-18 Vistakon, Inc. Apparatus and method for satisfying disposable contact lens prescriptions
US5021953A (en) * 1988-01-06 1991-06-04 Travelmation Corporation Trip planner optimizing travel itinerary selection conforming to individualized travel policies
US5023832A (en) * 1989-01-12 1991-06-11 Honeywell Inc. Method of maintaining asynchronous real-time data
US5072401A (en) * 1989-10-03 1991-12-10 Pitney Bowes Inc. Optimizing mail delivery systems by logistics planning
AU651327B2 (en) * 1989-11-28 1994-07-21 Japan Air Lines Co. Ltd. Reservation system terminal
US5138710A (en) * 1990-04-25 1992-08-11 Unisys Corporation Apparatus and method for providing recoverability in mass storage data base systems without audit trail mechanisms
DE59010106D1 (en) * 1990-07-16 1996-03-14 Siemens Ag Communication system with a multiprocessor system serving the central control
GB2248370B (en) * 1990-09-25 1994-08-17 Uken Generation of reports in a data processing apparatus
US5367452A (en) * 1990-10-05 1994-11-22 Carts Of Colorado, Inc. Mobile merchandising business management system which provides comprehensive support services for transportable business operations
US5237499A (en) * 1991-11-12 1993-08-17 Garback Brent J Computer travel planning system
US5311516A (en) * 1992-05-29 1994-05-10 Motorola, Inc. Paging system using message fragmentation to redistribute traffic
US5414845A (en) * 1992-06-26 1995-05-09 International Business Machines Corporation Network-based computer system with improved network scheduling system

Also Published As

Publication number Publication date
DE69431784D1 (en) 2003-01-09
EP0660251A3 (en) 1996-11-13
EP0660251B1 (en) 2002-11-27
EP0660251A2 (en) 1995-06-28
US5764981A (en) 1998-06-09
DE69431784T2 (en) 2003-08-14
ATE228678T1 (en) 2002-12-15
ES2190785T3 (en) 2003-08-16
CA2137167A1 (en) 1995-06-23

Similar Documents

Publication Publication Date Title
CA2137167C (en) Data management method and architecture
CN111815283B (en) Information system engineering supervision enterprise business management system
US5253166A (en) Pre-ticket travel reservation record keeping system
CN111815424B (en) Information system engineering supervision project cost accounting management system
US7117162B1 (en) System and Method for Facilitating Managing a Job
Thomas et al. Towards a task-based paradigm for flexible and adaptable access control in distributed applications
US20040138930A1 (en) Ticket tracking and redeeming system and method
US5600554A (en) Methods and apparatus for securing, integrating, and manipulating employee payroll and human resource information
US6092050A (en) Graphical computer system and method for financial estimating and project management
US6119094A (en) Automated system for identifying alternate low-cost travel arrangements
CN111815281B (en) Information system project supervision project bid management system
CN111815168A (en) Information system engineering supervision project quality management system
CN112967025A (en) Information engineering supervision project image progress management system
JP2002526819A (en) Cross application timesheet
CA2476595A1 (en) System and method for enterprise-wide business process management
WO2001025964A2 (en) Base service architectures for netcentric computing systems
WO2001086567A2 (en) System for capturing, processing, tracking and reporting proposal, project, time and expense data
CN1201539A (en) Multiple currency travel reservation information management system and method
US7529681B2 (en) Ticket tracking, reminding, and redeeming system and method
WO2003079140A2 (en) Revenue recognition system and method for efficiently performing business-related processing and storing of event information related to a transaction
EP0793184A2 (en) Method and apparatus for distributing work flow processes among a plurality of users
US20030028452A1 (en) System, method and apparatus for formatting inventory data
AU2001230456A1 (en) Realtime online travel information and reservations systems and service
JP2001195447A (en) Communication managing device in enterprise resource planning
Fransson et al. Management information systems for corporate real estate

Legal Events

Date Code Title Description
EEER Examination request
MKEX Expiry

Effective date: 20141202

MKEX Expiry

Effective date: 20141202