Category: Visual FoxPro 7

  • Visual FoxPro and FoxPro for DOS Video Books

    Visual FoxPro and FoxPro for DOS Video Books

    Video books in my Library.

    Visual FoxPro 6 Language Reference by Microsoft

    Visual FoxPro 6 Language Reference by Microsoft

    Mastering FoxPro by Charles Siegel

    Mastering FoxPro by Charles Siegel

    Miriam Liskin Programming FoxPro 2.5 for DOS – Part – 1

    Miriam Liskin Programming FoxPro 2.5 for DOS – Part – 1

    Miriam Liskin Programming FoxPro 2.5 for DOS – Part – 2

    Miriam Liskin Programming FoxPro 2.5 for DOS – Part – 2

    Miriam Liskin Programming FoxPro 2.5 for DOS – Part – 3

    Miriam Liskin Programming FoxPro 2.5 for DOS – Part – 3

    Visual FoxPro 3 Codebook Yair Alan Griver

    Visual FoxPro 3 Codebook Yair Alan Griver

    FoxPro 2.6 for DOS Code Book by Yair Alan Griver

    FoxPro 2.6 for DOS Code Book by Yair Alan Griver

    Miriam Liskin Visual FoxPro Expert Solutions

    Miriam Liskin Visual FoxPro Expert Solutions

    Visual FoxPro 6 Programmer”s The Essential Guide

    Visual FoxPro 6 Programmer”s The Essential Guide

    Using Visual FoxPro 6 by Menachem Bazian

    Using Visual FoxPro 6 by Menachem Bazian

    Mastering Visual FoxPro 3 by Charles Siegel 1993

    Mastering Visual FoxPro 3 by Charles Siegel 1993

    The Revolutionary Guide To Visual FoxPro OOP Professional Development

    The Revolutionary Guide To Visual FoxPro OOP Professional Development

    Advanced Object Oriented Programming With Visual FoxPro 6 by Markus Eggar

    Advanced Object Oriented Programming With Visual FoxPro 6 by Markus Eggar

    Object Orientation In Visual FoxPro by Savannah Brentnall

    Object Orientation In Visual FoxPro by Savannah Brentnall

    Visual FoxPro 3 Unleashed by Menachem Bazian, Jim Booth, Jeb Long, Doug Norman

    Visual FoxPro 3 Unleashed by Menachem Bazian, Jim Booth, Jeb Long, Doug Norman
    Accounting Software General Ledger System GoldCoin FoxPro 2 6 for DOS
    Accounting Software Payroll System Attendance Salary Sheets Wages & other Reports
    Accounting Software GL System Reports Chart of Account Trial Balance and All other Reports
    Accounting Software GL System Chart of Accounts Level Three up to Balance Sheet Accounts
    Accounting Software General Ledger Chart of Accounts Level Three Accounts Part Two
    Accounting Software GL System Chart of Accounts Level Three Accounts Creation Part One
    Accounting Software General Ledger System Chart of Accounts Level Two Accounts Creation
    Accounting Software General Ledger System Chart of Accounts Level One Accounts Creation
    Accounting Software General Ledger System Chart of Accounts Ideas FoxPro and QuickBooks
    Accounting Software General Ledger System Voucher Entry
    Accounting Software General Ledger System Overview of Menus

    By Amjad Izhar
    Contact: amjad.izhar@gmail.com
    https://amjadizhar.blog

  • Visual FoxPro 7 Commands

    Visual FoxPro 7 Commands

    Supported Visual FoxPro SET Commands

    Unsupported Visual FoxPro Commands and Functions

    Symbols
    & Command

    Performs macro substitution.

    & VarName[.cExpression]

    Parameters

    & VarName Specifies the name of the variable or array element to reference in the macro substitution. Do not include the M. prefix that distinguishes variables from fields. Such inclusion causes a syntax error. The macro should not exceed the maximum statement length permitted in Visual FoxPro.

    A variable cannot reference itself recursively in macro substitution. For example, the following generates an error message:

    STORE '&gcX' TO gcX
    ? &gcX

    Macro substitution statements that appear in DO WHILE, FOR, and SCAN are evaluated only at the start of the loop and are not reevaluated on subsequent iterations. Any changes to the variable or array element that occur within the loop are not recognized. .cExpression The optional period (.) delimiter and .cExpression are used to append additional characters to a macro. cExpression appended to the macro with .cExpression can also be a macro. If cExpression is a property name, include an extra period (cExpression..PropertyName).

    01
    White Gold Plated White & Pink Cubic Zirconia Dangle Earrings for Women Daily Evening Parties Wear Lightweight Jewelry Earring Gift for Her

    Remarks

    Macro substitution treats the contents of a variable or array element as a character string literal. When an ampersand (&) precedes a character-type variable or array element, the contents of the variable or element replace the macro reference. You can use macro substitution in any command or function that accepts a character string literal.

    Tip   Whenever possible, use a name expression instead of macro substitution. A name expression operates like macro substitution. However, a name expression is limited to passing character strings as names. Use a name expression for significantly faster processing if a command or function accepts a name (a file name, window name, menu name, and so on). For additional information on name expressions, see Overview of the Language.

    While the following commands are acceptable:

    STORE 'customer' TO gcTableName
    STORE 'company'  TO gcTagName
    USE &gcTableName ORDER &gcTagName

    use a name expression instead:

    USE (gcTableName) ORDER (gcTagName)

    Macro substitution is useful for substituting a keyword in a command. In the following example, the TALK setting is saved to a variable so the setting can be restored later in the program. The original TALK setting is restored with macro substitution.

    Example

    STORE SET('TALK') TO gcSaveTalk
    SET TALK OFF
    *
    *  Additional program code
    *
    SET TALK &gcSaveTalk  && Restore original TALK setting

    && Command

    Indicates the beginning of a nonexecuting inline comment in a program file.

    && [Comments]

    Parameters

    Comments Indicates that inline comments follow. For example:

    STORE (20*12) TO gnPayments  && 20 years of monthly payments

    Inserting inline comments to denote the end of the IF … ENDIF, DO, and FOR … ENDFOR structured programming commands greatly improves the readability of programs.

    Remarks

    Place a semicolon (;) at the end of each comment line that continues to a following line. You cannot place && and a comment after the semicolon used to continue a command line to an additional line.

    Example

    NOTE  Initialize the page number;
       variable.
    STORE 1 to gnPageNum
    * Set up the loop
    DO WHILE gnPageNum <= 25  && loop 25 times
       gnPageNum = gnPageNum + 1
    ENDDO  && DO WHILE gnPageNum <= 25
    • * Command

    Indicates the beginning of a nonexecuting comment line in a program file.

    * [Comments]

    Parameters

    Comments Specifies the comment in the comment line. For example:

    *   This is a comment

    Remarks

    Place a semicolon (;) at the end of each comment line that continues to a following line.

    Example

    * Initialize the page number;
       variable.
    STORE 1 to gnPageNum
    * Set up the loop
    DO WHILE gnPageNum <= 25  && loop 25 times
       gnPageNum = gnPageNum + 1
    ENDDO  && DO WHILE gnPageNum <= 25

    ? | ?? Command

    ??? Command

    @ … BOX Command

    @ … CLASS Command

    @ … CLEAR Command

    @ … EDIT – Edit Boxes Command

    @ … FILL Command

    @ … GET – Check Boxes Command

    @ … GET – Combo Boxes Command

    @ … GET – Command Buttons Command

    @ … GET – List Boxes Command

    @ … GET – Option Buttons Command

    @ … GET – Spinners Command

    @ … GET – Text Boxes Command

    @ … GET – Transparent Buttons Command

    @ … MENU Command

    @ … PROMPT Command

    @ … SAY – Pictures & OLE Objects Command

    @ … SAY Command

    @ … SCROLL Command

    @ … TO Command

    | Command

    A
    ACCEPT Command

    ACTIVATE MENU Command

    ACTIVATE POPUP Command

    ACTIVATE SCREEN Command

    ACTIVATE WINDOW Command

    ADD CLASS Command

    ADD TABLE Command

    ALTER TABLE – SQL Command

    APPEND Command

    APPEND FROM ARRAY Command

    APPEND FROM Command

    APPEND GENERAL Command

    APPEND MEMO Command

    APPEND PROCEDURES Command

    ASSERT Command

    ASSIST Command

    AVERAGE Command

    B
    BEGIN TRANSACTION Command

    BLANK Command

    BROWSE Command

    BUILD APP Command

    BUILD DLL Command

    BUILD EXE Command

    BUILD MTDLL Command

    BUILD PROJECT Command

    C
    CALCULATE Command

    CALL Command

    CANCEL Command

    CD | CHDIR Command

    CHANGE Command

    CLEAR Commands

    CLOSE Commands

    CLOSE MEMO Command

    COMPILE Command

    COMPILE DATABASE Command

    COMPILE FORM Command

    CONTINUE Command

    COPY FILE Command

    COPY INDEXES Command

    COPY MEMO Command

    COPY PROCEDURES Command

    COPY STRUCTURE Command

    COPY STRUCTURE EXTENDED Command

    COPY TAG Command

    COPY TO ARRAY Command

    COPY TO Command

    COUNT Command

    CREATE CLASS Command

    CREATE CLASSLIB Command

    CREATE COLOR SET Command

    CREATE Command

    CREATE CONNECTION Command

    CREATE CURSOR – SQL Command

    CREATE DATABASE Command

    CREATE FORM Command

    CREATE FROM Command

    CREATE LABEL Command

    CREATE MENU Command

    CREATE PROJECT Command

    CREATE QUERY Command

    CREATE REPORT – Quick Report Command

    CREATE REPORT Command

    CREATE SCREEN – Quick Screen Command

    CREATE SCREEN Command

    CREATE SQL VIEW Command

    CREATE TABLE – SQL Command

    CREATE TRIGGER Command

    CREATE VIEW Command

    D
    DEACTIVATE MENU Command

    DEACTIVATE POPUP Command

    DEACTIVATE WINDOW Command

    DEBUG Command

    DEBUGOUT Command

    DECLARE – DLL Command

    DECLARE Command

    DEFINE BAR Command

    DEFINE BOX Command

    DEFINE CLASS Command

    DEFINE MENU Command

    DEFINE PAD Command

    DEFINE POPUP Command

    DEFINE WINDOW Command

    DELETE – SQL Command

    DELETE Command

    DELETE CONNECTION Command

    DELETE DATABASE Command

    DELETE FILE Command

    DELETE TAG Command

    DELETE TRIGGER Command

    DELETE VIEW Command

    DIMENSION Command

    DIR or DIRECTORY Command

    DISPLAY Command

    DISPLAY CONNECTIONS Command

    DISPLAY DATABASE Command

    DISPLAY DLLS Command

    DISPLAY FILES Command

    DISPLAY MEMORY Command

    DISPLAY OBJECTS Command

    DISPLAY PROCEDURES Command

    DISPLAY STATUS Command

    DISPLAY STRUCTURE Command

    DISPLAY TABLES Command

    DISPLAY VIEWS Command

    DO CASE … ENDCASE Command

    DO Command

    DO FORM Command

    DO WHILE … ENDDO Command

    DOEVENTS Command

    DROP TABLE Command

    DROP VIEW Command

    E
    EDIT Command

    EJECT Command

    EJECT PAGE Command

    END TRANSACTION Command

    ERASE Command

    ERROR Command

    EXIT Command

    EXPORT Command

    EXTERNAL Command

    F
    FIND Command

    FLUSH Command

    FOR EACH … ENDFOR Command

    FOR … ENDFOR Command

    FREE TABLE Command

    FUNCTION Command

    G
    GATHER Command

    GETEXPR Command

    GO | GOTO Command

    H
    HELP Command

    HIDE MENU Command

    HIDE POPUP Command

    HIDE WINDOW Command

    I
    IF … ENDIF Command

    IMPORT Command

    INDEX Command

    INPUT Command

    INSERT – SQL Command

    INSERT Command

    J
    JOIN Command

    K
    KEYBOARD Command

    L
    LABEL Command

    LIST Commands

    LIST CONNECTIONS Command

    LIST DATABASE Command

    LIST DLLS Command

    LIST OBJECTS Command

    LIST PROCEDURES Command

    LIST TABLES Command

    LIST VIEWS Command

    LOAD Command

    LOCAL Command

    LOCATE Command

    LOOP Command

    LPARAMETERS Command

    M
    MD | MKDIR Command

    MENU Command

    MENU TO Command

    MODIFY CLASS Command

    MODIFY COMMAND Command

    MODIFY CONNECTION Command

    MODIFY DATABASE Command

    MODIFY FILE Command

    MODIFY FORM Command

    MODIFY GENERAL Command

    MODIFY LABEL Command

    MODIFY MEMO Command

    MODIFY MENU Command

    MODIFY PROCEDURE Command

    MODIFY PROJECT Command

    MODIFY QUERY Command

    MODIFY REPORT Command

    MODIFY SCREEN Command

    MODIFY STRUCTURE Command

    MODIFY VIEW Command

    MODIFY WINDOW Command

    MOUSE Command

    MOVE POPUP Command

    MOVE WINDOW Command

    N
    NOTE Command

    O
    ON BAR Command

    ON ERROR Command

    ON ESCAPE Command

    ON EXIT BAR Command

    ON EXIT MENU Command

    ON EXIT PAD Command

    ON EXIT POPUP Command

    ON KEY = Command

    ON KEY Command

    ON KEY LABEL Command

    ON PAD Command

    ON PAGE Command

    ON READERROR Command

    ON SELECTION BAR Command

    ON SELECTION MENU Command

    ON SELECTION PAD Command

    ON SELECTION POPUP Command

    ON SHUTDOWN Command

    OPEN DATABASE Command

    P
    PACK Command

    PACK DATABASE Command

    PARAMETERS Command

    PLAY MACRO Command

    POP KEY Command

    POP MENU Command

    POP POPUP Command

    PRINTJOB … ENDPRINTJOB Command

    PRIVATE Command

    PROCEDURE Command

    PUBLIC Command

    PUSH KEY Command

    PUSH MENU Command

    PUSH POPUP Command

    Q
    QUIT Command

    R
    RD | RMDIR Command

    READ Command

    READ EVENTS Command

    READ MENU Command

    RECALL Command

    REGIONAL Command

    REINDEX Command

    RELEASE BAR Command

    RELEASE CLASSLIB Command

    RELEASE Command

    RELEASE LIBRARY Command

    RELEASE MENUS Command

    RELEASE PAD Command

    RELEASE POPUPS Command

    RELEASE PROCEDURE Command

    RELEASE WINDOWS Command

    REMOVE CLASS Command

    REMOVE TABLE Command

    RENAME CLASS Command

    RENAME Command

    RENAME CONNECTION Command

    RENAME TABLE Command

    RENAME VIEW Command

    REPLACE Command

    REPLACE FROM ARRAY Command

    REPORT Command

    RESTORE FROM Command

    RESTORE MACROS Command

    RESTORE SCREEN Command

    RESTORE WINDOW Command

    RESUME Command

    RETRY Command

    RETURN Command

    ROLLBACK Command

    RUN | Command

    S
    SAVE MACROS Command

    SAVE SCREEN Command

    SAVE TO Command

    SAVE WINDOWS Command

    SCAN … ENDSCAN Command

    SCATTER Command

    SCROLL Command

    SEEK Command

    SELECT – SQL Command

    SELECT Command

    SET ALTERNATE Command

    SET ANSI Command

    SET ASSERTS Command

    SET AUTOSAVE Command

    SET BELL Command

    SET BLOCKSIZE Command

    SET BORDER Command

    SET BROWSEIME Command

    SET BRSTATUS Command

    SET CARRY Command

    SET CENTURY Command

    SET CLASSLIB Command

    SET CLEAR Command

    SET CLOCK Command

    SET COLLATE Command

    SET COLOR OF Command

    SET COLOR OF SCHEME Command

    SET COLOR SET Command

    SET COLOR TO Command

    SET Command

    SET COMPATIBLE Command

    SET CONFIRM Command

    SET CONSOLE Command

    SET COVERAGE Command

    SET CPCOMPILE Command

    SET CPDIALOG Command

    SET CURRENCY Command

    SET CURSOR Command

    SET DATABASE Command

    SET DATASESSION Command

    SET DATE Command

    SET DEBUG Command

    SET DEBUGOUT Command

    SET DECIMALS Command

    SET DEFAULT Command

    SET DELETED Command

    SET DELIMITERS Command

    SET DEVELOPMENT Command

    SET DEVICE Command

    SET DISPLAY Command

    SET DOHISTORY Command

    SET ECHO Command

    SET ESCAPE Command

    SET EVENTLIST Command

    SET EVENTTRACKING Command

    SET EXACT Command

    SET EXCLUSIVE Command

    SET FDOW Command

    SET FIELDS Command

    SET FILTER Command

    SET FIXED Command

    SET FORMAT Command

    SET FULLPATH Command

    SET FUNCTION Command

    SET FWEEK Command

    SET HEADINGS Command

    SET HELP Command

    SET HELPFILTER Command

    SET HOURS Command

    SET INDEX Command

    SET INTENSITY Command

    SET KEY Command

    SET KEYCOMP Command

    SET LIBRARY Command

    SET LOCK Command

    SET LOGERRORS Command

    SET MACKEY Command

    SET MARGIN Command

    SET MARK OF Command

    SET MARK TO Command

    SET MEMOWIDTH Command

    SET MESSAGE Command

    SET MULTILOCKS Command

    SET NEAR Command

    SET NOCPTRANS Command

    SET NOTIFY Command

    SET NULL Command

    SET NULLDISPLAY Command

    SET ODOMETER Command

    SET OLEOBJECT Command

    SET OPTIMIZE Command

    SET ORDER Command

    SET PALETTE Command

    SET PATH Command

    SET PDSETUP Command

    SET POINT Command

    SET PRINTER Command

    SET PROCEDURE Command

    SET READBORDER Command

    SET REFRESH Command

    SET RELATION Command

    SET RELATION OFF Command

    SET REPROCESS Command

    SET RESOURCE Command

    SET SAFETY Command

    SET SECONDS Command

    SET SEPARATOR Command

    SET SKIP Command

    SET SKIP OF Command

    SET SPACE Command

    SET STATUS BAR Command

    SET STATUS Command

    SET STEP Command

    SET STRICTDATE Command

    SET SYSFORMATS Command

    SET SYSMENU Command

    SET TALK Command

    SET TEXTMERGE Command

    SET TEXTMERGE DELIMITERS Command

    SET TOPIC Command

    SET TOPIC ID Command

    SET TRBETWEEN Command

    SET TYPEAHEAD Command

    SET UDFPARMS Command

    SET UNIQUE Command

    SET VIEW Command

    SET VOLUME Command

    SET WINDOW OF MEMO Command

    SHOW GET Command

    SHOW GETS Command

    SHOW MENU Command

    SHOW OBJECT Command

    SHOW POPUP Command

    SHOW WINDOW Command

    SIZE POPUP Command

    SIZE WINDOW Command

    SKIP Command

    SORT Command

    STORE Command

    SUM Command

    SUSPEND Command

    SYS(2001) – SET … Command Status

    T
    TEXT … ENDTEXT Command

    TOTAL Command

    TYPE Command

    U
    UNLOCK Command

    UPDATE – SQL Command

    UPDATE Command

    USE Command

    V
    VALIDATE DATABASE Command

    W
    WAIT Command

    WITH … ENDWITH Command

    X
    Y
    Z
    ZAP Command

    ZOOM WINDOW Command

  • Garfield Hudson: Visual FoxPro Tutorials

    Garfield Hudson: Visual FoxPro Tutorials

    YouTube Videos

    Add Menu to an SDI (Top Level) Form
    Q&A: How to sort ascending/descending when grid header clicked
    Q&A: How To Create An Executable File In VFP 9?
    Learn Visual FoxPro @ garfieldhudson.com – User defined Functions and Procedures (Lesson 15 of 30)
    Learn Visual FoxPro @ garfieldhudson.com – Q&A: Using Related Tables In A Report (Lesson 30 of 30)
    Learn Visual FoxPro @ garfieldhudson.com – Building a Simple Application – Pt. 6 (Lesson 29 of 30)
    Learn Visual FoxPro @ garfieldhudson.com – Building a Simple Application – Pt. 5 (Lesson 28 of 30)
    Learn Visual FoxPro @ garfieldhudson.com – Building a Simple Application – Pt. 4 (Lesson 27 of 30)
    Learn Visual FoxPro @ garfieldhudson.com – Building a Simple Application – Pt. 3 (Lesson 26 of 30)
    Learn Visual FoxPro @ garfieldhudson.com – Building a Simple Application – Pt. 2 (Lesson 25 of 30)
    Learn Visual FoxPro @ garfieldhudson.com – FoxPro and the SQL Language (Lesson 24 of 30)
    Learn Visual FoxPro @ garfieldhudson.com – Building a Simple Application – Pt. 1 (Lesson 23 of 30)
    Learn Visual FoxPro @ garfieldhudson.com – Basic Reporting – Pt. 2 (Lesson 22 of 30)
    Learn Visual FoxPro @ garfieldhudson.com – Basic Reporting – Pt. 1 (Lesson 21 of 30)
    Learn Visual FoxPro @ garfieldhudson.com – Creating System/Application Menus (Lesson 20 of 30)
    Learn Visual FoxPro @ garfieldhudson.com – The Project Manager (Lesson 19 of 30)
    Learn Visual FoxPro @ garfieldhudson.com – Some Built-In Functions (Lesson 18 of 30)
    Learn Visual FoxPro @ garfieldhudson.com – Data Buffering (Lesson 17 of 30)
    Learn Visual FoxPro @ garfieldhudson.com – Using SET Commands (Lesson 16 of 30)
    Learn Visual FoxPro @ garfieldhudson.com – Creating a Form Manually (Lesson 14 of 30)
    Learn Visual FoxPro @ garfieldhudson.com – The FORM Wizard (Lesson 13 of 30)
    Learn Visual FoxPro @ garfieldhudson.com – Programming VFP (concepts & constructs) (Lesson 12 of 30)
    Learn Visual FoxPro @ garfieldhudson.com – Work Areas And Aliases (Lesson 11 of 30)
    Learn Visual FoxPro @ garfieldhudson.com – Importing/Exporting Records (Lesson 10 of 30)
    Learn Visual FoxPro @ garfieldhudson.com – Indexing Records (Lesson 9 of 30)
    Learn Visual FoxPro @ garfieldhudson.com – Sorting Records (Lesson 8 of 30)
    Learn Visual FoxPro @ garfieldhudson.com – Deleting/Recalling Records (Lesson 7 of 30)
    Learn Visual FoxPro @ garfieldhudson.com – Navigating Records in a Table (Lesson 6 of 30)
    Learn Visual FoxPro @ garfieldhudson.com – Understanding Command Scope (Lesson 5 of 30)
    Learn Visual FoxPro @ garfieldhudson.com – Modifying the structure of a table (Lesson 4 of 30)
    Learn Visual FoxPro @ garfieldhudson.com – Creating a Data File or Table (Lesson 3 of 30)
    Learn Visual FoxPro @ garfieldhudson.com – Data and Data Types (Lesson 2 of 30)
    Learn Visual FoxPro @ garfieldhudson.com – Tour The IDE (Lesson 1 of 30)

    Garfield Hudson

    @garfieldhudson•

    1.3K subscribers•33 videos

    Garfield Hudson

    More info

    www.youtube.com/@garfieldhudson
    Joined Jan 29, 2008
    1.3K subscribers
    33 videos
    230,526 views

    By Amjad Izhar
    Contact: amjad.izhar@gmail.com
    https://amjadizhar.blog

  • Software Legacy and Life of a Software as It Comes To An End As Long As It is Marketed. Effort and Investment Get Lost.

    Software Legacy and Life of a Software as It Comes To An End As Long As It is Marketed. Effort and Investment Get Lost.

    When a software product nears the end of its lifecycle, it doesn’t simply vanish — it echoes across corporate hallways and user communities like a ghost in the machine. Software, much like living organisms, is born, evolves, matures, and eventually faces decline. Yet unlike biological life, the decline of software is heavily shaped by market forces, corporate strategies, and shifting user demands.

    The digital landscape is littered with the remnants of once-celebrated tools, platforms, and systems that were painstakingly crafted and marketed, only to be abandoned when no longer profitable or strategically viable. This phenomenon raises critical questions about our approach to technological investment and stewardship. Do we truly understand the long-term consequences of our technological dependencies?

    In this article, we explore the bittersweet journey of software as it transitions from a promising innovation to an obsolete relic. Drawing upon insights from thought leaders and classic works like Code Complete by Steve McConnell and The Mythical Man-Month by Frederick P. Brooks Jr., we examine how effort, vision, and financial investment often evaporate into thin air once a product is no longer marketable.


    1- Birth of Software: The Spark of Innovation

    The genesis of any software product is often an electrifying moment marked by excitement and ambition. Teams pour in creative energy, envisioning a tool that will change user experiences or redefine a market segment. During this stage, innovation thrives, and the promise of solving real-world problems fuels engineers and designers alike. The first lines of code are written not just as functional statements but as hopeful blueprints for future impact.

    Steve Jobs once said, “Innovation distinguishes between a leader and a follower.” This is especially true in software, where early ideation shapes everything that follows. Books like Crossing the Chasm by Geoffrey A. Moore discuss how initial adoption curves can make or break software during this fragile birth phase.


    2- Growth and Market Capture

    Once launched, software enters a growth stage where market penetration becomes the primary goal. Marketing teams craft compelling narratives, while engineers rapidly iterate to fix bugs and add features to capture larger user bases. This phase is often accompanied by rapid revenue growth and rising brand recognition.

    However, this stage also introduces significant technical debt as speed is prioritized over perfection. As the software gains traction, customer expectations soar, leading to an ever-expanding feature set. “The problem with quick wins,” writes Cal Newport in Deep Work, “is that they often defer deeper, strategic thinking.” Companies must walk a tightrope between aggressive expansion and maintaining a sustainable codebase.


    3- Maturity and Saturation

    At maturity, software enjoys a stable market position and a loyal user base. Financially, this can be the most rewarding period. New customers join at a steady rate, and the software may even become an industry standard. During this time, refinements and optimizations take center stage rather than groundbreaking features.

    Yet this period of equilibrium can breed complacency. Teams may resist significant changes to avoid alienating existing customers, and innovation often stalls. As Clayton Christensen explains in The Innovator’s Dilemma, established players frequently struggle to adopt disruptive technologies because they are invested in maintaining their current success.


    4- Onset of Decline

    Despite best efforts, external forces such as emerging competitors, shifting user preferences, or technological advancements inevitably push software toward decline. Symptoms include declining sales, dwindling support, and fewer updates. Loyal users start seeking alternatives that offer better performance or modern interfaces.

    This phase underscores the transient nature of software success. “Nothing endures but change,” said Heraclitus, and nowhere is this more evident than in software lifecycle management. Companies must decide whether to sunset the product gracefully or attempt a radical reinvention.


    5- The Role of Marketing During Decline

    As a product nears the end, marketing shifts from acquisition to damage control and retention. Campaigns focus on reassuring existing customers, providing migration paths, or highlighting continued support timelines. Sometimes, nostalgia marketing is employed to maintain goodwill, even as the product quietly exits.

    However, no marketing magic can fully reverse the trend of obsolescence. According to Philip Kotler’s Marketing Management, when decline is imminent, companies should consider harvesting or divesting strategies to minimize losses. This pragmatic approach can help preserve brand reputation and reallocate resources.


    6- Financial and Emotional Investments

    The sunsetting of a software product represents not only financial losses but also emotional investments by teams who have nurtured it for years. Engineers, designers, and marketers often feel a profound sense of loss, as their professional identity may be closely tied to the product.

    Moreover, sunk costs can cloud strategic decisions, leading companies to prolong the inevitable. Daniel Kahneman’s Thinking, Fast and Slow delves into how cognitive biases like loss aversion influence business decisions, making rational exits challenging.


    7- Technical Debt and Legacy Burden

    As software ages, it accumulates technical debt — shortcuts taken to meet deadlines or market demands. Over time, maintaining such systems becomes disproportionately expensive and resource-draining. The codebase becomes fragile, making even minor updates risky.

    Martin Fowler’s Refactoring emphasizes that “any fool can write code that a computer can understand. Good programmers write code that humans can understand.” Unfortunately, legacy systems often violate this principle, making them a heavy burden rather than an asset.


    8- User Trust and Brand Perception

    Sunsetting software can severely impact user trust, especially if it happens abruptly or without sufficient support mechanisms. Long-term customers feel betrayed when investments in training and integration are rendered futile.

    In The Trusted Advisor, David H. Maister argues that trust is the bedrock of business relationships and must be preserved even during difficult transitions. Companies that manage exits transparently can maintain goodwill and open doors for future ventures.


    9- Documentation and Knowledge Loss

    When software is discontinued, documentation efforts often wind down, and institutional knowledge dissipates. Engineers move on, leaving behind cryptic code and partial manuals. This makes future audits or possible revivals exceedingly difficult.

    According to Code Complete, well-maintained documentation is as critical as the code itself, yet it is frequently neglected. Knowledge loss compounds the finality of a product’s demise and limits the possibility of meaningful reuse.


    10- Migration Challenges for Users

    Users dependent on discontinued software face daunting migration challenges. Data portability, compatibility, and retraining create barriers that can hinder business continuity. Such transitions often involve hidden costs and operational risks.

    A strategic migration plan can mitigate these issues, as suggested by Software Engineering at Google. Companies that provide clear migration paths and robust support stand out as customer-centric and earn long-term loyalty.


    11- Impact on Ecosystems and Integrations

    Modern software rarely operates in isolation. Its retirement affects partner ecosystems, integrations, and third-party developers. APIs become deprecated, and connected workflows break, causing ripple effects across organizations.

    The Platform Revolution by Geoffrey Parker and Marshall Van Alstyne explains how interconnected ecosystems amplify both growth and decline. A single product’s exit can disrupt entire value chains, highlighting the interconnected nature of digital economies.


    12- Competitive Responses

    When a major software product exits, competitors quickly capitalize on the vacuum, offering migration incentives, feature parity, or superior alternatives. This creates opportunities for market reshaping and aggressive repositioning.

    Companies that fail to anticipate these competitive moves often lose market share rapidly. As Sun Tzu said in The Art of War, “In the midst of chaos, there is also opportunity.” Recognizing decline early allows firms to prepare defensive and offensive strategies.


    13- Open Source vs Proprietary Farewell

    Open source software sometimes enjoys a different fate. Even when abandoned by the original maintainers, community-driven forks can extend its life. In contrast, proprietary software often vanishes completely once support is dropped.

    Eric Raymond’s The Cathedral and the Bazaar underscores the resilience of open source ecosystems. Communities can breathe new life into legacy code, mitigating the finality of market-driven discontinuation.


    14- Legal and Compliance Considerations

    Retiring software must also address legal liabilities and compliance obligations. Sensitive data handling, audit trails, and contractual commitments can complicate shutdown plans significantly.

    Books like Information Privacy Law by Daniel Solove emphasize that compliance is not optional and mishandling shutdowns can lead to costly lawsuits and reputational damage. Proper planning ensures a clean exit and legal safety.


    15- Emotional Attachment of Users

    Users often form deep emotional attachments to software they have used for years. When a favorite tool disappears, it disrupts not only workflows but also personal comfort and nostalgia.

    As Sherry Turkle discusses in Alone Together, technology shapes our identities and relationships. Abrupt discontinuations can feel like personal losses, warranting empathy and considerate offboarding strategies from developers.


    16- The Myth of Perpetual Maintenance

    Many believe software can be maintained indefinitely if revenue streams justify it. However, continuous maintenance is costly and often unsustainable due to resource limitations, talent churn, and evolving standards.

    Frederick Brooks Jr. cautioned in The Mythical Man-Month that adding resources to late software makes it later. Maintenance is no exception; scaling it indefinitely is rarely viable, making graceful sunsets a pragmatic necessity.


    17- Futureproofing and Architectural Planning

    Architecting software with futureproofing in mind can delay obsolescence. Modular designs, robust APIs, and scalable infrastructures reduce the likelihood of early retirement. Yet, even the best architectures cannot guarantee eternal relevance.

    Michael Nygard’s Release It! advocates designing for resilience and graceful degradation. By anticipating eventual decline, architects can design systems that degrade gracefully rather than collapse suddenly.


    18- Ethical Considerations

    Beyond profitability, ethical questions arise when discontinuing software that supports critical services or vulnerable populations. Abandoning such products without transition plans can have severe societal impacts.

    James Moor’s writings on computer ethics emphasize the moral responsibility of technologists to consider broader human consequences. Ethical exits require transparency, support, and adequate notice to minimize harm.


    19- Opportunity Costs and Strategic Reallocation

    Sunsetting frees resources that can be redirected to innovative projects or emerging market opportunities. This strategic reallocation is crucial for organizational agility and long-term growth.

    Peter Drucker’s Innovation and Entrepreneurship suggests that knowing when to abandon unviable projects is as important as knowing when to start new ones. Recognizing opportunity costs enables forward-thinking reinvestment.


    20- Lessons for the Future

    The decline of software products offers valuable lessons for future ventures. It teaches humility, strategic foresight, and the importance of customer trust. Each sunset can illuminate paths for more sustainable and impactful technological journeys.

    As Nassim Nicholas Taleb describes in Antifragile, systems that learn from failures become stronger over time. Companies that treat software sunsets as learning opportunities can build more resilient and adaptable product portfolios.


    21- What “software legacy” means

    The term “software legacy” refers to systems or applications that continue to exist and function long after their creators intended. While often viewed negatively — implying outdated code, compatibility headaches, and high maintenance costs — legacy software also carries historical, technical, and even cultural significance. It embodies the decisions, constraints, and design philosophies of its era, serving as a digital time capsule.

    As Brian Kernighan famously said, “Controlling complexity is the essence of computer programming.” Legacy software stands as a testament to this struggle, revealing the trade-offs between innovation and maintainability. Books such as Clean Architecture by Robert C. Martin further illuminate how architectural decisions made today become the legacies of tomorrow.


    22- Software often becomes most popular or widely marketed when it is already technologically obsolete or approaching end-of-life

    It is an ironic twist that software frequently reaches peak popularity precisely when it is technologically outdated. Driven by heavy marketing campaigns or institutional inertia, products continue to gain traction even as they are being internally phased out. This phenomenon can be attributed to brand loyalty, sunk cost, and a reluctance to change.

    Marshall McLuhan’s idea that “the medium is the message” applies here; the perception shaped by marketing can overshadow technical deficiencies. Despite lacking modern features or security safeguards, such software rides a final wave of market enthusiasm before its inevitable sunset.


    23- Why understanding software life cycles matters today (rapid tech shifts, increasing cloud/SaaS reliance, etc.)

    In today’s fast-paced digital environment, characterized by rapid technological shifts and the dominance of cloud and SaaS models, understanding software life cycles is more crucial than ever. New paradigms demand continuous adaptation and constant re-evaluation of technological investments.

    Moreover, dependencies on legacy systems can create hidden liabilities. As articulated in The Phoenix Project by Gene Kim, IT systems must evolve in step with business needs to avoid bottlenecks and security vulnerabilities. Awareness of life cycles ensures proactive planning rather than reactive crisis management.


    24- The Life Cycle of Software

    The software life cycle is a conceptual model that describes the stages software undergoes from inception to retirement. It encompasses design, development, growth, maturity, decline, and end-of-life phases, each requiring different strategies and resources.

    While the cycle may appear linear, in reality, it is often iterative, with feedback loops that inform future versions or entirely new products. Understanding this dynamic helps organizations allocate resources wisely and manage risks effectively, as explained in Software Engineering by Ian Sommerville.


    25- Birth: Idea, development, initial adoption

    The birth phase is a period of creativity and exploration. Developers and stakeholders craft visions and turn abstract ideas into functional prototypes. Enthusiasm runs high as teams validate concepts and attract early adopters who shape the product’s first iterations.

    Early adoption serves as a crucial feedback mechanism, helping refine usability and functionality. This phase also establishes the foundational code architecture that, for better or worse, will influence the product’s entire lifespan. As noted by Eric Ries in The Lean Startup, learning from initial user feedback is indispensable for sustainable growth.


    26- Growth: Widespread adoption, expansion of features, community building

    During the growth stage, the focus shifts to capturing market share and expanding capabilities. Marketing campaigns intensify, and user communities blossom, contributing plugins, extensions, and ideas. Feature roadmaps become ambitious, sometimes at the expense of technical stability.

    This period often results in technical debt accumulation as speed is prioritized over quality. A vibrant community, however, can act as a double-edged sword: while it strengthens brand loyalty, it also raises expectations that can be difficult to meet in later stages.


    27- Maturity: Peak market penetration, stable user base, incremental improvements

    At maturity, software reaches its zenith in terms of user base and market saturation. Development efforts turn to polishing features, optimizing performance, and offering robust support rather than radical innovation. Incremental improvements keep the product relevant without drastically altering user experiences.

    Yet, this stability may mask looming challenges. Competitors start offering newer, more efficient solutions, and maintaining interest without disruptive changes becomes a delicate balancing act. As Jim Collins writes in Good to Great, “Good is the enemy of great” — a cautionary reminder that comfort can hinder progress.


    28- Decline: Technological stagnation, competitors emerge, decreasing relevance

    Decline is characterized by technological stagnation and eroding relevance as competitors introduce superior alternatives. Bug fixes replace innovation, and marketing budgets dwindle. Users begin migrating to newer platforms, and community engagement drops sharply.

    This phase also tests leadership resolve: whether to invest in rejuvenation, pivot to new products, or prepare for a graceful exit. The emotional toll on teams is considerable, as they must witness their creation fall out of favor despite their dedication and effort.


    29- End of life: Official support ends, security and compatibility issues arise

    End of life (EOL) marks the official cessation of support and development. Security vulnerabilities and compatibility issues proliferate, forcing remaining users to transition or assume significant risks.

    A responsible EOL plan should include clear communication, transition guides, and data migration support to reduce disruption. The absence of such measures can damage brand trust irreparably and expose users to serious operational threats.


    30- The Irony of Popularity Near the End

    A curious irony often arises when software receives a surge in popularity as it nears obsolescence. Institutional momentum, familiarity, and aggressive marketing efforts create the illusion of vitality, even as internal teams prepare for discontinuation.

    This late-stage popularity acts as a double-edged sword: it offers a final revenue surge but also complicates the transition strategy. As Niccolò Machiavelli famously warned, “The wise man does at once what the fool does finally.” Organizations must resist the temptation to misinterpret this final popularity as long-term viability.


    31- Case studies of software that gained mass popularity or marketing push close to end-of-life

    Adobe Flash is perhaps the most famous example. Despite being technologically outdated, it continued to be widely used and marketed until its abrupt demise in 2020. Similarly, Windows 7 enjoyed a late surge in popularity, driven by user resistance to Windows 8, even though Microsoft had announced EOL plans.

    AngularJS also experienced a paradoxical push in adoption despite its announced deprecation. These cases highlight the tension between market forces and technical realities and illustrate the high stakes involved in transitioning user bases.


    32- Marketing vs. technical viability: how marketing can prolong life artificially

    Marketing campaigns can artificially extend a product’s life, painting a vibrant image of its relevance even when it is technically lagging. Promotional tactics leverage emotional connections, brand loyalty, and perceived stability to keep customers engaged.

    However, this approach is ultimately unsustainable. As Seth Godin explains in This Is Marketing, authentic value must underlie promotion. Prolonging an obsolete product through marketing alone often backfires, leading to disillusionment and rapid loss of trust once the façade cracks.


    33- Psychological factors: fear of change, comfort with legacy systems

    Human psychology heavily influences software longevity. Fear of change, cognitive inertia, and comfort with familiar systems discourage users from adopting newer solutions. Organizations, too, cling to legacy systems to avoid short-term disruptions, even at the cost of long-term risks.

    Daniel Kahneman’s Thinking, Fast and Slow explores how biases like loss aversion and status quo bias shape decision-making. Overcoming these psychological hurdles requires education, clear incentives, and strong leadership.


    34- Business Incentives vs. Technical Realities

    Business leaders often prioritize immediate revenue and market stability over technical debt reduction and future-proofing. This misalignment fosters environments where legacy software is maintained far beyond its logical lifespan.

    Peter Drucker emphasized that “management is doing things right; leadership is doing the right things.” Aligning business incentives with technical realities demands strategic courage and a willingness to invest in long-term health over short-term gains.


    35- Why companies continue to market or sell legacy software

    Companies continue to market legacy software because it provides consistent revenue streams, especially from large, risk-averse enterprise customers. Maintaining a familiar platform reduces churn and preserves relationships with long-standing clients.

    Moreover, support contracts and certification requirements lock in customers, making transitions financially and operationally unattractive. This reliance becomes a self-perpetuating cycle that discourages innovation and accelerates obsolescence.


    36- Revenue streams from maintenance, extended support contracts, and add-on services

    Legacy software often generates lucrative income from maintenance fees, extended support contracts, and ancillary services. These steady revenue streams appeal to stakeholders focused on financial predictability rather than technological excellence.

    While profitable, this approach can stifle innovation and tie up resources that could otherwise fund new initiatives. Books like Blue Ocean Strategy encourage shifting from saturated markets to create new value propositions rather than squeezing existing products dry.


    37- Technical debt and sunk cost fallacies on the customer side

    Customers also fall prey to sunk cost fallacies, clinging to outdated systems due to the investments already made in licenses, integrations, and training. This irrational commitment perpetuates reliance on fragile, outdated software.

    Technical debt compounds the problem, making modernization prohibitively complex and expensive. As highlighted in The DevOps Handbook, technical debt, if not addressed proactively, becomes a silent tax on future innovation and agility.


    38- Impact on Users and Developers

    Legacy software impacts users by exposing them to security risks and compliance violations, while developers face the demoralizing task of patching archaic code instead of building innovative features. This environment can cause frustration and burnout.

    Additionally, maintaining outdated systems limits skill growth among IT teams, reducing their market competitiveness. The opportunity cost extends beyond the immediate product, affecting career trajectories and organizational agility.


    39- Risks of sticking to legacy software (security vulnerabilities, compliance issues)

    Reliance on legacy systems significantly increases exposure to security breaches and compliance failures. Unsupported software lacks critical updates, making it a prime target for cyberattacks.

    Moreover, regulatory requirements often demand up-to-date security practices and data handling standards. Organizations that ignore these obligations risk penalties, legal consequences, and irreparable damage to their reputations.


    40- Skills stagnation among developers or IT teams

    Long-term focus on maintaining legacy systems stagnates developers’ skills, depriving them of exposure to modern frameworks, cloud architectures, and advanced security practices. Over time, these teams lose relevance in a fast-evolving job market.

    Organizations face compounded risks as experienced engineers retire, leaving knowledge gaps that exacerbate maintenance challenges. Continuous upskilling and modernization are essential to retain talent and sustain technical resilience.


    41- Impact on innovation and tech ecosystems

    Widespread reliance on legacy software dampens broader industry innovation. Resources that could nurture groundbreaking ideas are siphoned into maintaining old systems, slowing overall progress.

    This stifling effect echoes through entire ecosystems, affecting partners, integrators, and dependent startups. As Joseph Schumpeter noted, “Creative destruction is the essential fact about capitalism.” Avoiding necessary renewal ultimately undermines collective growth and adaptability.


    42- Software Legacy and Cultural Value

    Over time, some software transcends mere utility to become cultural artifacts. Tools like Winamp or early Photoshop versions evoke nostalgia, representing formative digital experiences for entire generations.

    Such products reflect societal shifts in creativity, communication, and entertainment, earning places in technological folklore. They highlight the emotional and historical layers that shape our relationships with technology.


    43- When software becomes more than a tool: cultural artifacts

    When software becomes culturally significant, it ceases to be a mere productivity tool and becomes an emblem of identity and shared experience. These artifacts inspire community-driven preservation efforts and memorialization.

    For example, emulators and online archives ensure that classic software remains accessible, fostering a sense of continuity and digital heritage. Books like The New Analog by Damon Krukowski explore how technology carries emotional and cultural resonance beyond functionality.


    44- Nostalgia-driven marketing and “revival” movements

    Companies sometimes leverage nostalgia to rekindle interest in legacy products, launching retro editions or “throwback” marketing campaigns. This strategy appeals to emotional memory rather than technical merit.

    While effective in the short term, nostalgia-driven revivals rarely sustain long-term engagement unless coupled with substantive modernization. As Simon Sinek argues in Start With Why, enduring loyalty is built on shared values, not mere sentimentality.


    45- Open-source resurrection and community-driven forks

    Open-source communities often revive abandoned software through forks and community maintenance. This approach extends the software’s life beyond corporate interests, empowering users to shape its evolution.

    Examples include LibreOffice emerging from OpenOffice and the continued survival of classic gaming engines. These efforts exemplify Eric Raymond’s assertion in The Cathedral and the Bazaar that “given enough eyeballs, all bugs are shallow,” celebrating collective stewardship.


    46- Planning for a Software “Afterlife”

    Thoughtful end-of-life planning mitigates disruption and preserves goodwill. Clear EOL policies, robust migration paths, and extended community support help transition users smoothly, maintaining trust and operational continuity.

    Proactive planning also honors the product’s legacy, providing a dignified conclusion rather than an abrupt termination. As described in Site Reliability Engineering by Google’s SRE team, graceful degradation is critical to user experience and brand reputation.


    47- Strategies for graceful sunsets: clear EOL policies, migration paths, community support

    Graceful sunsets require transparency, empathy, and foresight. Announcing EOL timelines well in advance, providing detailed migration guides, and enabling community support channels ensure users feel supported rather than abandoned.

    These strategies demonstrate respect for users’ investments and foster goodwill that can benefit future products. A well-managed sunset can transform a potential reputational crisis into an opportunity for positive brand reinforcement.


    48- Data portability and long-term archival

    Ensuring data portability is a moral and practical imperative during software shutdowns. Users should retain control over their data, with clear mechanisms for exporting and migrating it to new platforms.

    Additionally, long-term archival solutions preserve data integrity for future needs, such as audits or historical research. As emphasized in Data and Goliath by Bruce Schneier, data stewardship is a cornerstone of digital trust and responsibility.


    49- Encouraging adoption of modern alternatives

    Facilitating transitions to modern alternatives prevents user lock-in and reduces systemic risks. Providing training resources, migration incentives, and compatibility tools smooths the transition and strengthens ecosystem resilience.

    Forward-thinking organizations embrace this approach as an investment in future loyalty rather than a loss of immediate revenue. By guiding users toward safer, more innovative solutions, companies reinforce their commitment to customer success.


    50- Lessons for Future Software Design and Marketing

    The end-of-life narratives of legacy software offer vital lessons: design for adaptability, embrace continuous modernization, and prioritize transparency over short-term gains. Marketing should amplify genuine value rather than obscure technical shortcomings.

    Future software initiatives should be built with lifecycle awareness, architectural resilience, and ethical user stewardship in mind. As Alan Kay wisely stated, “The best way to predict the future is to invent it.” By integrating these lessons, organizations can craft technologies that not only succeed but leave meaningful legacies.


    The Legacy of Software: When Popularity Masks the End

    Introduction

    In technology, we often celebrate the birth of new software — those exciting launches filled with promise and possibility. We also watch as certain products grow to dominate their space, shaping industries and influencing millions of lives.

    But what happens when a piece of software quietly nears its end, even as it continues to be marketed and used widely? What happens to all the time, money, and passion invested when the world inevitably moves on?

    This is the paradox of software: it can be most popular and heavily promoted precisely at the moment it is technologically obsolete underneath. As someone who lived this experience through the rise and fall of FoxPro and Visual FoxPro, I’d like to explore what it means to build, maintain, and ultimately say goodbye to software — and what we can learn from its legacy.


    My Journey with FoxPro: A Personal Perspective

    When I look back at my journey as a software developer, some of my most intense and rewarding years were spent working with FoxPro and later Visual FoxPro. Back then, FoxPro was more than just a tool — it was a powerful companion that let me bring ideas to life quickly and deliver real value to businesses.

    I remember the excitement of designing forms, building data-driven applications, and seeing them make a real difference in clients’ day-to-day operations. FoxPro was fast, flexible, and remarkably ahead of its time in terms of database handling. For a while, it felt like it would last forever.

    I invested countless hours — learning its quirks, refining my code, building reusable libraries, and developing entire systems that powered critical business processes. It wasn’t just a job; it was a craft I took pride in, and each project felt like a personal achievement.

    I still remember late nights spent debugging data anomalies, the joy of a smooth deployment, and the satisfaction of hearing from a client that their operations were running more efficiently because of something I had built. These moments created a deep sense of connection to my work.

    But as the years passed, the software landscape began to shift. New languages, frameworks, and paradigms emerged, promising better integration with the web, cross-platform capabilities, and scalable architectures. The push toward cloud-based applications, open-source ecosystems, and rapid iteration cycles made FoxPro feel increasingly isolated.

    Microsoft’s announcement to discontinue Visual FoxPro felt like a slow-motion blow. At first, there was hope: maybe the community could keep it alive, maybe there would be an unexpected revival. But reality settled in as support timelines expired, developer communities shrank, and new developers no longer learned the tools I had spent years mastering.

    The official support ended, and overnight, years of accumulated knowledge, effort, and intellectual property felt obsolete. Systems I had poured my heart into became “legacy” almost instantly — a word that sounds dignified but often hides a deeper pain for developers who built them.

    It wasn’t only about lost revenue or technical debt. There was a deeper, more personal sense of loss — like watching a trusted companion grow old and fade away, knowing that no amount of expertise or love could bring it back into mainstream relevance.

    For many developers like me, this experience was a harsh but important lesson: no software is forever, no matter how good or how widely adopted it is today. It taught me the importance of adaptability, of continuously learning new tools and technologies, and of designing systems that can evolve rather than stay frozen in time.

    It also taught me humility — realizing that the value we create in software isn’t just in the lines of code, but in the ability to solve problems for people today, even if tomorrow those solutions will need to evolve or be replaced.

    In retrospect, while the investments in FoxPro may seem “lost” on paper, they were invaluable in shaping how I approach software today — with a respect for impermanence, an openness to change, and a deeper empathy for both users and developers caught in the churn of technological progress.


    The Life Cycle of Software: From Birth to End of Life

    Every piece of software goes through a natural life cycle:

    • Birth: An idea turns into a product, often targeting a specific problem or market niche.
    • Growth: Adoption grows, features expand, and the community strengthens.
    • Maturity: The software becomes stable, widely used, and trusted.
    • Decline: Newer technologies emerge, innovation stalls, and usage starts to shrink.
    • End of life (EOL): Official support ends, and the software is left to fade — or live on as a legacy system.

    Ironically, it’s often during maturity and decline that software can appear most successful to the outside world. Companies may continue heavy marketing, training, and selling, even as internally they prepare to move on. This disconnect can leave developers and businesses unprepared for the eventual end.


    Business Incentives vs. Technical Realities

    Companies have strong reasons to keep legacy software alive as long as possible. Revenue from maintenance contracts, support fees, and licensing can be significant. Meanwhile, customers are often reluctant to migrate because of sunk costs and the fear of breaking something that “still works.”

    This tension between commercial success and technical viability can result in a product that looks healthy from the outside but is running on borrowed time underneath.


    Lessons for Future Software Design and Marketing

    Design for Change, Not Permanence

    Software is not a monument; it’s a living organism. We should design systems to be modular, decoupled, and adaptable — able to evolve as business needs and technologies change.

    Communicate Honestly About Lifecycle

    Honesty with users about a product’s future builds trust. Instead of stringing customers along, vendors should provide clear roadmaps, realistic sunset plans, and transparent support timelines.

    Invest in Skills, Not Just Tools

    As I learned from FoxPro, investing in a single tool can leave you vulnerable when the market shifts. Building fundamental skills — system design, architecture thinking, problem-solving — ensures long-term resilience.

    Embrace Community and Open Source

    When possible, open source communities can extend a software’s life or inspire new forks. While Visual FoxPro never fully succeeded here, many other projects (like MySQL, Kubernetes, and countless others) show what’s possible when the community takes ownership.

    Plan for a Graceful Exit

    Responsible software development includes planning for an eventual end. Offer migration guides, keep data export easy, and support users through transitions. A well-planned exit can preserve trust and minimize disruption.


    Conclusion: Honoring the True Legacy

    When I look back at FoxPro today, I don’t see wasted effort. I see an era of learning, of solving real problems, of growth. The software may have ended, but the lessons and the relationships built around it continue to shape me as a developer and as a thinker.

    We often talk about software “legacy” in terms of outdated code and technical debt, but its true legacy lies in the human stories behind it — the nights spent debugging, the pride in delivering solutions, and the resilience to start over when the world inevitably moves on.

    If we can remember these stories and build with this awareness, we can create software — and careers — that are not just relevant for today, but also resilient for tomorrow.


    A Final Reflection

    “Legacy is not just about old code left behind; it’s about the imprint it leaves on those who built it and those who used it. If we carry forward the wisdom, no effort is ever truly lost.”


    Call to Action

    As you build or maintain software today, ask yourself:
    ✅ Are you designing for adaptability?
    ✅ Are you preparing for an eventual transition?
    ✅ Are you investing in people and skills beyond the tools?

    Because ultimately, the true legacy of your software isn’t the code you leave behind — it’s the impact you make and the lessons you carry forward.

    Conclusion

    In tracing the arc from birth to decline, we recognize that software mirrors our own human narratives of ambition, success, decline, and remembrance. While marketing can momentarily prolong its life, software ultimately stands or falls on its technical merit, user trust, and cultural resonance.

    Understanding and respecting software life cycles empower us to create products that serve not just commercial goals but societal and historical ones as well. By designing with foresight and retiring with dignity, we leave behind not mere code but enduring stories of innovation and human creativity.

    The life of software is a microcosm of the human condition: ambitious beginnings, glorious peaks, inevitable declines, and lasting legacies. While marketing can extend a product’s lifespan, it cannot grant immortality. Effort, investment, and emotional attachments inevitably dissolve when the final update is pushed and support pages go dark.

    By acknowledging the impermanence of software, we cultivate more mindful practices in design, marketing, and sunsetting. We honor the past, serve the present, and prepare for the future — all while remembering that no software, no matter how revolutionary, is exempt from the fundamental truth: all things must pass.

    Bibliography

    1. Ian Sommerville. Software Engineering. Pearson, 10th Edition, 2015.
    2. Robert C. Martin. Clean Architecture: A Craftsman’s Guide to Software Structure and Design. Prentice Hall, 2017.
    3. Eric Ries. The Lean Startup: How Today’s Entrepreneurs Use Continuous Innovation to Create Radically Successful Businesses. Crown Business, 2011.
    4. Gene Kim, Kevin Behr, George Spafford. The Phoenix Project: A Novel About IT, DevOps, and Helping Your Business Win. IT Revolution Press, 2013.
    5. Jim Collins. Good to Great: Why Some Companies Make the Leap… and Others Don’t. HarperBusiness, 2001.
    6. Daniel Kahneman. Thinking, Fast and Slow. Farrar, Straus and Giroux, 2011.
    7. Peter Drucker. The Effective Executive: The Definitive Guide to Getting the Right Things Done. HarperBusiness, 2006.
    8. W. Chan Kim, Renée Mauborgne. Blue Ocean Strategy: How to Create Uncontested Market Space and Make the Competition Irrelevant. Harvard Business Review Press, 2015.
    9. Gene Kim, Jez Humble, Patrick Debois, John Willis. The DevOps Handbook: How to Create World-Class Agility, Reliability, and Security in Technology Organizations. IT Revolution Press, 2016.
    10. Eric Raymond. The Cathedral & the Bazaar: Musings on Linux and Open Source by an Accidental Revolutionary. O’Reilly Media, 2001.
    11. Bruce Schneier. Data and Goliath: The Hidden Battles to Collect Your Data and Control Your World. W. W. Norton & Company, 2015.
    12. Simon Sinek. Start With Why: How Great Leaders Inspire Everyone to Take Action. Portfolio, 2009.
    13. Seth Godin. This Is Marketing: You Can’t Be Seen Until You Learn to See. Portfolio, 2018.
    14. Damon Krukowski. The New Analog: Listening and Reconnecting in a Digital World. The New Press, 2017.
    15. Nicole Forsgren, Jez Humble, Gene Kim. Accelerate: The Science of Lean Software and DevOps: Building and Scaling High Performing Technology Organizations. IT Revolution Press, 2018.
    16. Benjamin Treynor Sloss (ed.). Site Reliability Engineering: How Google Runs Production Systems. O’Reilly Media, 2016.
    17. Alan Kay. Various essays and interviews on software design and innovation. (Referenced for philosophy rather than a single book.)

    By Amjad Izhar
    Contact: amjad.izhar@gmail.com
    https://amjadizhar.blog

  • Visual FoxPro 6 Accounting, Inventory & Payroll Integrated Software PRG files Developed by Me in 1996

    Visual FoxPro 6 Accounting, Inventory & Payroll Integrated Software PRG files Developed by Me in 1996

    PRG files in Original Script.

    ACCTCODE.PRG

    • Date: 12-Feb-2017
    • Program: AcctCode.PRG
    • Program to replace AcctCode Field with C1+C2+C3 code
    • and Replace chart field with chart description

    CLEAR
    CLOSE ALL

    SET TALK OFF
    SET SAFE OFF
    SET CONFIRM OFF

    CLEAR
    @ 20, 40 SAY “Running INDEXALL.PRG” FONT “Times New Roman”,26
    DO INDEXALL.PRG

    CLEAR
    @ 20, 40 SAY “Running acctcode.PRG – ldgrcode.dbf updates” FONT “Times New Roman”,26

    USE ldgrcode EXCL

    SCAN

    MPC1 = REPLICATE('0',2-LEN(LTRIM(STR(c1))))+LTRIM(STR(c1))
    MPC2 = REPLICATE('0',2-LEN(LTRIM(STR(c2))))+LTRIM(STR(c2))
    MPC3 = REPLICATE('0',3-LEN(LTRIM(STR(c3))))+LTRIM(STR(c3))
    REPLACE acctcode WITH MPC1+"-"+MPC2+"-"+MPC3
    
    DO CASE
        CASE c1 >= 10 AND c1 <= 19
            REPLACE chart WITH "Capital / Equity"
        CASE c1 >= 20 AND c1 <= 29
            REPLACE chart WITH "Long Term Liabilities"
        CASE c1 >= 30 AND c1 <= 39
            REPLACE chart WITH "Current Liabilities"
        CASE c1 >= 40 AND c1 <= 49
            REPLACE chart WITH "Long Term Assets"
        CASE c1 >= 50 AND c1 <= 59
            REPLACE chart WITH "Current Assets"
        CASE c1 >= 60 AND c1 <= 69
            REPLACE chart WITH "Sales / Revenues"
        CASE c1 >= 70 AND c1 <= 79
            REPLACE chart WITH "Cost of Sales"
        CASE c1 >= 80 AND c1 <= 89
            REPLACE chart WITH "Expenses"
        CASE c1 >= 90 AND c1 <= 99
            REPLACE chart WITH "Appropriations"
    
    OTHERWISE
        REPLACE chart WITH "Not Applicable"
    ENDCASE
    

    ENDSCAN

    INDEX ON acctcode TAG acctcode
    INDEX ON chart TAG chart
    USE


    CLEAR
    CLOSE ALL

    CLEAR
    @ 20, 40 SAY “Running acctcode.PRG – tran.dbf updates” FONT “Times New Roman”,26

    USE tran EXCL

    SCAN

    MPC1 = REPLICATE('0',2-LEN(LTRIM(STR(c1))))+LTRIM(STR(c1))
    MPC2 = REPLICATE('0',2-LEN(LTRIM(STR(c2))))+LTRIM(STR(c2))
    MPC3 = REPLICATE('0',3-LEN(LTRIM(STR(c3))))+LTRIM(STR(c3))
    REPLACE acctcode WITH MPC1+"-"+MPC2+"-"+MPC3
    
    DO CASE
        CASE c1 >= 10 AND c1 <= 19
            REPLACE chart WITH "Capital / Equity"
        CASE c1 >= 20 AND c1 <= 29
            REPLACE chart WITH "Long Term Liabilities"
        CASE c1 >= 30 AND c1 <= 39
            REPLACE chart WITH "Current Liabilities"
        CASE c1 >= 40 AND c1 <= 49
            REPLACE chart WITH "Long Term Assets"
        CASE c1 >= 50 AND c1 <= 59
            REPLACE chart WITH "Current Assets"
        CASE c1 >= 60 AND c1 <= 69
            REPLACE chart WITH "Sales / Revenues"
        CASE c1 >= 70 AND c1 <= 79
            REPLACE chart WITH "Cost of Sales"
        CASE c1 >= 80 AND c1 <= 89
            REPLACE chart WITH "Expenses"
        CASE c1 >= 90 AND c1 <= 99
            REPLACE chart WITH "Appropriations"
    
    OTHERWISE
        REPLACE chart WITH "Not Applicable"
    ENDCASE
    

    ENDSCAN

    INDEX ON acctcode TAG acctcode
    INDEX ON chart TAG chart
    USE
    USE ldgrcode EXCL
    INDEX ON acctcode TAG acctcode
    USE

    SELECT 1
    USE tran ORDER acctcode

    SELECT 2
    USE ldgrcode ORDER acctcode

    SELECT 1
    SET RELATION TO acctcode INTO ldgrcode ADDITIVE

    REPL ALL title WITH ldgrcode.title

    CLEAR
    CLOSE ALL


    CLEAR
    CLOSE ALL

    CLEAR
    @ 20, 40 SAY “Running acctcode.PRG – master.dbf updates” FONT “Times New Roman”,26

    USE master EXCL

    SCAN

    MPC1 = REPLICATE('0',2-LEN(LTRIM(STR(c1))))+LTRIM(STR(c1))
    MPC2 = REPLICATE('0',2-LEN(LTRIM(STR(c2))))+LTRIM(STR(c2))
    MPC3 = REPLICATE('0',3-LEN(LTRIM(STR(c3))))+LTRIM(STR(c3))
    REPLACE acctcode WITH MPC1+"-"+MPC2+"-"+MPC3
    
    DO CASE
        CASE c1 >= 10 AND c1 <= 19
            REPLACE chart WITH "Capital / Equity"
        CASE c1 >= 20 AND c1 <= 29
            REPLACE chart WITH "Long Term Liabilities"
        CASE c1 >= 30 AND c1 <= 39
            REPLACE chart WITH "Current Liabilities"
        CASE c1 >= 40 AND c1 <= 49
            REPLACE chart WITH "Long Term Assets"
        CASE c1 >= 50 AND c1 <= 59
            REPLACE chart WITH "Current Assets"
        CASE c1 >= 60 AND c1 <= 69
            REPLACE chart WITH "Sales / Revenues"
        CASE c1 >= 70 AND c1 <= 79
            REPLACE chart WITH "Cost of Sales"
        CASE c1 >= 80 AND c1 <= 89
            REPLACE chart WITH "Expenses"
        CASE c1 >= 90 AND c1 <= 99
            REPLACE chart WITH "Appropriations"
    
    OTHERWISE
        REPLACE chart WITH "Not Applicable"
    ENDCASE
    

    ENDSCAN

    INDEX ON acctcode TAG acctcode
    INDEX ON chart TAG chart
    USE

    USE ldgrcode EXCL
    INDEX ON acctcode TAG acctcode
    USE

    SELECT 1
    USE master ORDER acctcode

    SELECT 2
    USE ldgrcode ORDER acctcode

    SELECT 1
    SET RELATION TO acctcode INTO ldgrcode ADDITIVE

    REPL ALL title WITH ldgrcode.title

    CLEAR
    CLOSE ALL


    • Tran-key VchNo field type Character 5-12-12345

    CLEAR
    CLOSE ALL

    CLEAR
    @ 20, 40 SAY “Running acctcode.PRG – tran-key.dbf updates” FONT “Times New Roman”,26

    USE tran-key EXCL

    SCAN

    MVCH1 = REPLICATE('0',1-LEN(LTRIM(STR(vch_type))))+LTRIM(STR(vch_type))
    MVCH2 = REPLICATE('0',2-LEN(LTRIM(STR(vch_no1))))+LTRIM(STR(vch_no1))
    MVCH3 = REPLICATE('0',5-LEN(LTRIM(STR(vch_no2))))+LTRIM(STR(vch_no2))
    REPLACE VchNo WITH MVCH1+"-"+MVCH2+"-"+MVCH3
    
    DO CASE
    
        CASE vch_type = 1
            REPLACE type WITH "Cash Receipt"
        CASE vch_type = 2
            REPLACE type WITH "Cash Payment"
        CASE vch_type = 3
            REPLACE type WITH "Bank Receipt"
        CASE vch_type = 4
            REPLACE type WITH "Bank Payment"
        CASE vch_type = 5
            REPLACE type WITH "Journal"
        CASE vch_type = 6
            REPLACE type WITH "Sales"
        CASE vch_type = 7
            REPLACE type WITH "Purchase"
    
    OTHERWISE
        REPLACE type WITH "Not Applicable"
    ENDCASE
    

    ENDSCAN

    INDEX ON VchNo TAG VchNo
    INDEX ON Type TAG type
    USE


    • Tran VchNo field type Character 5-12-12345

    CLEAR
    CLOSE ALL

    CLEAR
    @ 20, 40 SAY “Running acctcode.PRG – tran.dbf updates” FONT “Times New Roman”,26

    USE tran EXCL

    SCAN

    MVCH1 = REPLICATE('0',1-LEN(LTRIM(STR(vch_type))))+LTRIM(STR(vch_type))
    MVCH2 = REPLICATE('0',2-LEN(LTRIM(STR(vch_no1))))+LTRIM(STR(vch_no1))
    MVCH3 = REPLICATE('0',5-LEN(LTRIM(STR(vch_no2))))+LTRIM(STR(vch_no2))
    REPLACE VchNo WITH MVCH1+"-"+MVCH2+"-"+MVCH3
    
    DO CASE
    
        CASE vch_type = 1
            REPLACE type WITH "Cash Receipt"
        CASE vch_type = 2
            REPLACE type WITH "Cash Payment"
        CASE vch_type = 3
            REPLACE type WITH "Bank Receipt"
        CASE vch_type = 4
            REPLACE type WITH "Bank Payment"
        CASE vch_type = 5
            REPLACE type WITH "Journal"
        CASE vch_type = 6
            REPLACE type WITH "Sales"
        CASE vch_type = 7
            REPLACE type WITH "Purchase"
    
    OTHERWISE
        REPLACE type WITH "Not Applicable"
    ENDCASE
    

    ENDSCAN

    INDEX ON VchNo TAG VchNo
    INDEX ON Type TAG type
    USE


    • Master VchNo field type Character 5-12-12345

    CLEAR
    CLOSE ALL

    CLEAR
    @ 20, 40 SAY “Running acctcode.PRG – master.dbf updates” FONT “Times New Roman”,26

    USE master EXCL

    SCAN

    MVCH1 = REPLICATE('0',1-LEN(LTRIM(STR(vch_type))))+LTRIM(STR(vch_type))
    MVCH2 = REPLICATE('0',2-LEN(LTRIM(STR(vch_no1))))+LTRIM(STR(vch_no1))
    MVCH3 = REPLICATE('0',5-LEN(LTRIM(STR(vch_no2))))+LTRIM(STR(vch_no2))
    REPLACE VchNo WITH MVCH1+"-"+MVCH2+"-"+MVCH3
    
    DO CASE
    
        CASE vch_type = 1
            REPLACE type WITH "Cash Receipt"
        CASE vch_type = 2
            REPLACE type WITH "Cash Payment"
        CASE vch_type = 3
            REPLACE type WITH "Bank Receipt"
        CASE vch_type = 4
            REPLACE type WITH "Bank Payment"
        CASE vch_type = 5
            REPLACE type WITH "Journal"
        CASE vch_type = 6
            REPLACE type WITH "Sales"
        CASE vch_type = 7
            REPLACE type WITH "Purchase"
    
    OTHERWISE
        REPLACE type WITH "Not Applicable"
    ENDCASE
    

    ENDSCAN

    INDEX ON VchNo TAG VchNo
    INDEX ON Type TAG type
    USE


    • This Update: 12-Feb-2017
    • Prepare ChartOfAccts.XLS

    CLEAR
    @ 20, 40 SAY “Running acctcode.PRG – XLS files” FONT “Times New Roman”,26

    SELECT Acctcode,;
    Title,;
    Ldgr_bal,;
    Status,;
    Chart,;
    LEFT(AcctCode,1) AS “ChrtNo”;
    FROM LdgrCode.dbf;
    ORDER BY AcctCode;
    INTO DBF ChartOfAccts.dbf

    CLOSE ALL

    USE ChartOfAccts.dbf EXCL
    INDEX ON AcctCode TAG AcctCode
    SET ORDER TO AcctCode
    COPY TO XLS\ChartOfAccts.XLS TYPE XLS
    USE

    CLOSE ALL

    SELECT Acctcode,;
    Title,;
    SUM(Ldgr_bal) AS “Total”,;
    Status,;
    Chart,;
    LEFT(AcctCode,1) AS “ChrtNo”,;
    LEFT(AcctCode,2) AS “C1”;
    FROM LdgrCode.dbf;
    ORDER BY AcctCode;
    GROUP BY ldgrcode.c1;
    INTO DBF SumLevel_1.dbf

    USE SumLevel_1.dbf EXCL
    INDEX ON AcctCode TAG AcctCode
    SET ORDER TO AcctCode
    COPY TO XLS\SumLevel_1.XLS TYPE XLS
    USE


    CLEAR
    CLEAR ALL
    CLOSE ALL

    CLEAR
    @ 20, 40 SAY “Running acctcode.PRG – Chart_L2.dbf updates” FONT “Times New Roman”,26

    SELECT C1,C2,TITLE FROM LDGRCODE INTO DBF CHART_L2.DBF WHERE C3=0 ORDER BY C1,C2
    SELECT CHART_L2
    USE

    SELECT 1
    USE CHART_L2 EXCL
    INDEX ON STR(C1,2)+STR(C2,2) TAG ACL2

    CLEAR
    CLEAR ALL
    CLOSE ALL

    ASKPW.PRG

    • PROGRAM : ASKPW.PRG
    • WRITTEN BY AMJAD IZHAR
    • LAST REVISED ON 03-04-2001
      *————————————

    SET TALK OFF
    PUBLIC pass,mm1,Permit
    CLEAR

    pass=SPACE(9)
    mm1=space(9)
    Permit = Space(2)

    DEFINE WINDOW upper FROM 0,0 TO 22,78 NONE
    ACTIVATE WINDOW upper
    @ 1,1 SAY “Password:”

    DEFINE WINDOW inwin FROM 2,0 TO 10,20 NONE
    DEFINE WINDOW hidewin FROM 2,0 TO 8,20 NONE
    ACTIVATE WINDOW hidewin NOSHOW
    HIDE WINDOW hidewin IN WINDOW inwin

    @ 1,1 GET pass PICT “@!”
    READ COLOR 1,1

    USE Usr

    LOCATE FOR usrcode = mMenu

    DO back

    DO CASE

    CASE pass <> mm1
    
        CLEAR WINDOWS
    
        *FOR a = 1 TO 4
        *   SET BELL TO 300,1
        *   ?? CHR(7)
        *   SET BELL TO
        *   DO ACSSDEN
    
            Permit = "OK"
    
        *ENDFOR
    
    CASE pass = mm1
            Permit = "OK"
    

    ENDCASE

    CLEAR WINDOWS
    DEACTIVATE WINDOW upper
    DEACTIVATE WINDOW inwin
    DEACTIVATE WINDOW hidewin


    PROCEDURE AcssDen



    • ÖÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ·
    • º º
    • º 07/23/96 ACSSDEN.SPR 13:13:49 º
    • º º
    • ÇÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄĶ
    • º º
    • º Author’s Name º
    • º º
    • º Copyright (c) 1996 Company Name º
    • º Address º
    • º City, Zip º
    • º º
    • º Description: º
    • º This program was automatically generated by GENSCRN. º
    • º º
    • ÓÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄĽ

    REGION 0

    REGIONAL m.currarea, m.talkstat, m.compstat

    IF SET(“TALK”) = “ON”
    SET TALK OFF
    m.talkstat = “ON”
    ELSE
    m.talkstat = “OFF”
    ENDIF
    m.compstat = SET(“COMPATIBLE”)
    SET COMPATIBLE FOXPLUS

    • ÖÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ·
    • º º
    • º MS-DOS Window definitions º
    • º º
    • ÓÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄĽ
      *
    • ÖÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ·
    • º º
    • º ACSSDEN/MS-DOS Screen Layout º
    • º º
    • ÓÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄĽ
      *

    REGION 1

    @ 13,33 SAY “Access Denied!” ;
    SIZE 1,14, 0

    REGION 0

    IF m.talkstat = “ON”
    SET TALK ON
    ENDIF
    IF m.compstat = “ON”
    SET COMPATIBLE ON
    ENDIF

    RETURN



    PROCEDURE back


    *PUBLIC mm1

    STORE SUBSTR(pw,1,1) TO ncode1
    STORE SUBSTR(pw,2,1) TO ncode2
    STORE SUBSTR(pw,3,1) TO ncode3
    STORE SUBSTR(pw,4,1) TO ncode4
    STORE SUBSTR(pw,5,1) TO ncode5
    STORE SUBSTR(pw,6,1) TO ncode6
    STORE SUBSTR(pw,7,1) TO ncode7
    STORE SUBSTR(pw,8,1) TO ncode8
    STORE SUBSTR(pw,9,1) TO ncode9

    mm1 = chr(asc(“&ncode1”)+30)+;
    chr(asc(“&ncode2”)+28)+;
    chr(asc(“&ncode3”)+29)+;
    chr(asc(“&ncode4”)+21)+;
    chr(asc(“&ncode5”)+19)+;
    chr(asc(“&ncode6”)+13)+;
    chr(asc(“&ncode7”)+12)+;
    chr(asc(“&ncode8”)+18)+;
    chr(asc(“&ncode9”)+19)

    RETURN

    ATDETSHT.PRG

    • Report Program for Employee Detailed Attendence Sheet

    SET TALK OFF
    SET SAFETY OFF

    CLEAR
    CLOSE DATA

    @ 1,20 SAY “Report: Employee Detailed Attendence Sheet”
    @ 2,20 SAY “——————————————“

    PUBLIC mMnth,mMcode,mYear,Vp
    mMnth = space(10)
    mMcode = 0
    mYear = 0
    Vp = space(1)

    SELECT 1
    USE attend ORDER empno2
    STORE mcode TO mMcode
    STORE year TO mYear

    SELECT 2
    USE employee ORDER empno

    SELECT 3
    USE salary ORDER empno

    SELECT 4
    USE ovtime ORDER empno2

    SELECT 5
    USE deptt ORDER deptcode

    SELECT 6
    USE salcode ORDER salcode

    SELECT 7
    USE month ORDER mcode
    STORE month.month TO mMnth

    SELECT 8
    USE artime ORDER empno2

    SELECT 1
    SET RELATION TO str(deptcode)+str(empno) INTO employee ADDITIVE
    SET RELATION TO str(deptcode)+str(empno) INTO salary ADDITIVE
    SET RELATION TO str(deptcode)+str(empno) INTO artime ADDITIVE
    SET RELATION TO str(deptcode)+str(empno) INTO ovtime ADDITIVE
    SET RELATION TO deptcode INTO deptt ADDITIVE
    SET RELATION TO mcode INTO month ADDITIVE

    SELECT 3
    SET RELATION TO salcode INTO salcode ADDITIVE

    SELECT 1

    DO AskEmpno

    @ 12,5 SAY “Report to Printer or View (P/V) ? “
    @ ROW(),COL() GET Vp PICT “@!” VALID INLIST(Vp,’P’,’V’);
    ERROR “(P)rinter,(V)iew “
    READ

    DO CASE

    CASE Vp = "P"
    
        REPORT FORM ATDETSHT.FRX TO PRINTER NOEJECT FOR;
         deptcode = mDptCode .and. empno = mEmpNo
    
    CASE Vp = "V"
    
        REPORT FORM ATDETSHT.FRX PREVIEW FOR;
         deptcode = mDptCode .and. empno = mEmpNo
    

    ENDCASE

    CLOSE DATA


    PROCEDURE AskEmpno


    PUBLIC mDptCode,mEmpNo

    mDptCode = 0
    mEmpNo = 0

    @ 5,5 SAY “Enter Empno for which you want Detailed Attendence Sheet ? “
    @ ROW(),COL() GET mDptCode PICT “99” VALID VmDptCode()
    @ ROW(),COL() SAY “-“
    @ ROW(),COL() GET mEmpNo PICT “999” VALID VmEmpNo()
    READ

    RETURN



    PROCEDURE VmDptCode


    SELECT deptt
    LOCATE FOR deptcode = mDptCode
    IF FOUND()
    @ 8,0 TO 8,79 CLEAR
    @ 8,5 SAY “Department Name: “
    @ ROW(),COL() SAY deptname
    SELECT 1
    RETURN .T.
    ELSE
    @ 8,0 TO 8,79 CLEAR
    WAIT WINDOW “Deptt.Code Not in File! Try Again” TIMEOUT 1
    SELECT 1
    RETURN .F.
    ENDIF
    SELECT 1
    RETURN .T.



    PROCEDURE VmEmpNo


    SELECT 1
    LOCATE FOR deptcode = mDptCode AND empno = mEmpNo

    DO CASE

    CASE FOUND()
    
        @ 10,0 TO 10,79 CLEAR
        @ 10,5 SAY "Employee Name: "
        @ ROW(),COL() SAY employee.name
    
    CASE NOT FOUND()
        @ 10,0 TO 10,79 CLEAR
        WAIT WINDOW "Employee Code Not in File! Try Again" TIMEOUT 1
        SELECT 1
        _CUROBJ = 1
        RETURN .T.
    

    ENDCASE

    SELECT 1

    RETURN .T.


    ATNDV2.PRG


    • PROGRAM: ATNDV2.PRG
    • Program to paint a brow for attendence register
    • with complete 31 days
    • Programmer: Amjad Izhar
    • This update: 29-Dec-2019

    DO mainprog


    PROCEDURE mainprog


    DO iniset
    DO SetVars
    DO paintbrow
    DO endprog
    RETURN



    PROCEDURE iniset


    CLEAR
    *HIDE POPUP mainmenu
    SET TALK OFF
    SET SAFETY OFF

    ON KEY LABEL F1 DO Ord1
    ON KEY LABEL F2 DO Ord2
    ON KEY LABEL F3 DO Ord3

    SET FUNCTION F4 TO
    SET FUNCTION F5 TO
    SET FUNCTION F6 TO
    SET FUNCTION F7 TO
    SET FUNCTION F8 TO
    SET FUNCTION F9 TO
    SET FUNCTION F10 TO
    SET FUNCTION F11 TO
    SET FUNCTION F12 TO

    PUBLIC mMcode,mYear
    mMcode = 0
    mYear = 0

    SELECT 1
    USE attend.dbf
    SET ORDER TO empno

    STORE mcode TO mMcode
    STORE year TO mYear

    SELECT 2
    USE employee.dbf
    SET ORDER TO empno

    SELECT 3
    USE month
    SET ORDER TO mcode

    SELECT 4
    USE ovtime
    SET ORDER TO empno

    SELECT 5
    USE deptt
    SET ORDER TO deptcode

    SELECT 6
    USE salary ORDER empno2

    SELECT 7
    USE saldtail ORDER empno

    SET FILTER TO
    SET FILTER TO mcode = mMcode AND year = mYear

    SELECT 1
    SET RELATION TO str(deptcode)+str(empno) INTO employee ADDITIVE
    SET RELATION TO str(deptcode)+str(empno) INTO salary ADDITIVE

    SET RELATION TO str(deptcode)+str(empno)+str(mcode)+str(year);
    INTO saldtail ADDITIVE

    SET RELATION TO mcode INTO month ADDITIVE
    SET RELATION TO str(deptcode)+str(empno)+str(mcode)+str(year) INTO ovtime ADDITIVE
    SET RELATION TO deptcode INTO deptt ADDITIVE

    goto top

    RETURN



    PROCEDURE SetVars


    PUBLIC CurFld
    CurFld = space(3)
    RETURN



    PROCEDURE paintbrow


    PUBLIC Pal

    *@ 0,0,40,120 BOX

    DEFINE WINDOW b FROM 0,0 TO 24,79

    mrecord = RECNO()

    SCAN
    Pal = d1+d2+d3+d4+d5+d6+d7+d8+d9+d10+d11+d12+d13+d14+d15+;
    d16+d17+d18+d19+d20+d21+d22+d23+d24+d25+d26+d27+d28+;
    d29+d30+d31

    REPLACE present WITH OCCURS(“P”,Pal)
    REPLACE absent WITH OCCURS(“A”,Pal)
    REPLACE leave WITH OCCURS(“L”,Pal)
    REPLACE late WITH OCCURS(“T”,Pal)
    ENDSCAN

    GOTO mrecord

    BROWS FIELDS;
    Eno = str(deptcode,2)+”-“+;
    str(empno,3)+”³”;
    :R :H = “Code” :W=.F.,;
    employee.name :18 :R :W=.F.,;
    L1 = “³” :1 :R :H = “” :W=.F.,D1:H=”1 “:P=”@!”:V=UP(),;
    D2:H=”2 “:P=”@!”:V=UP(),D3:H=”3 “:P=”@!”:V=UP(),;
    D4:H=”4 “:P=”@!”:V=UP(),D5:H=”5 “:P=”@!”:V=UP(),;
    D6:H=”6 “:P=”@!”:V=UP(),D7:H=”7 “:P=”@!”:V=UP(),;
    D8:H=”8 “:P=”@!”:V=UP(),D9:H=”9 “:P=”@!”:V=UP(),;
    D10:H=”10″:P=”@!”:V=UP(),D11:H=”11″:P=”@!”:V=UP(),;
    D12:H=”12″:P=”@!”:V=UP(),D13:H=”13″:P=”@!”:V=UP(),;
    D14:H=”14″:P=”@!”:V=UP(),D15:H=”15″:P=”@!”:V=UP();
    WINDOW b;
    NOAPPEND NODELETE

    BROWS FIELDS;
    Eno = str(deptcode,2)+”-“+;
    str(empno,3)+”³”;
    :R :H = “Code” :W=.F.,;
    employee.name :16 :R:W=.F.,;
    L1 = “³” :1 :R :H = “”:W=.F.,;
    D16:H=”16″:P=”@!”:V=UP(),D17:H=”17″:P=”@!”:V=UP(),;
    D18:H=”18″:P=”@!”:V=UP(),D19:H=”19″:P=”@!”:V=UP(),;
    D20:H=”20″:P=”@!”:V=UP(),D21:H=”21″:P=”@!”:V=UP(),;
    D22:H=”22″:P=”@!”:V=UP(),D23:H=”23″:P=”@!”:V=UP(),;
    D24:H=”24″:P=”@!”:V=UP(),D25:H=”25″:P=”@!”:V=UP(),;
    D26:H=”26″:P=”@!”:V=UP(),;
    D27:H=”27″:P=”@!”:V=UP(),;
    D28:H=”28″:P=”@!”:V=UP(),;
    D29:H=”29″:P=”@!”:V=UP(),;
    D30:H=”30″:P=”@!”:V=UP(),;
    D31:H=”31″:P=”@!”:V=UP();
    WINDOW b;
    NOAPPEND NODELETE

    ON KEY
    SET INDEX TO attend.cdx
    SET ORDER TO empno

    RETURN



    PROCEDURE below && Browse When clause


    @ 22,2 SAY deptcode
    @ 22,4 SAY “-“
    @ 22,5 SAY empno PICT “@L”

    *@ 22,9 SAY employee.salutation+”.”
    @ 22,12 SAY employee.name
    @ 22,35 SAY deptt.deptname

    @ 23,9 SAY “P=”
    @ 23,11 SAY present
    @ 23,15 SAY “A=”
    @ 23,17 SAY absent
    @ 23,21 SAY “L=”
    @ 23,23 SAY leave
    @ 23,27 SAY “T=”
    @ 23,29 SAY late

    IF ovtime.totalot <> 0
    @ 23,35 SAY “Tot.OT=”
    @ 23,42 SAY ovtime.totalot
    ELSE
    @ 23,32 TO 23,48 CLEAR

    ENDIF

    @ 22,60 SAY ALLTRIM(month.month)+”,”+ALLTRIM(STR(attend.year));
    COLOR GR+/B

    @ 23,60 SAY “Payable Days: “
    @ ROW(),COL() SAY pbldays

    @ 24,9 SAY “F1=Attendence Wise F2=Emp.No Wise F3=Name Wise”

    RETURN .T.



    PROCEDURE Up


    STORE VARREAD() TO CurFld

    IF INLIST(&CurFld,’P’,’A’,’L’,’T’,’ ‘,’F’,’H’) = .F.
    WAIT WINDOW “(P)resent,(A)bsent,(L)eave,La(T)e” TIMEOUT 3
    RETURN .F.
    ENDIF

    Pal = d1+d2+d3+d4+d5+d6+d7+d8+d9+d10+d11+d12+d13+d14+d15+;
    d16+d17+d18+d19+d20+d21+d22+d23+d24+d25+d26+d27+d28+;
    d29+d30+d31

    REPLACE present WITH OCCURS(“P”,Pal)
    REPLACE absent WITH OCCURS(“A”,Pal)
    REPLACE leave WITH OCCURS(“L”,Pal)
    REPLACE late WITH OCCURS(“T”,Pal)

    PUBLIC mPblDysS,mPblDysW,mPblDysP
    mPblDysS = 0
    mPblDysW = 0
    mPblDysP = 0

    IF present <> 0
    mPblDysS = month.mdays-absent
    mPblDysW = present+late
    mPblDysP = month.mdays-absent
    ENDIF

    DO CASE
    CASE salary.mpay AND NOT employee.probation

    REPLACE pbldays WITH mPblDysS
    

    CASE salary.mpay AND employee.probation

    REPLACE pbldays WITH mPblDysP
    

    CASE salary.mpay = .f. ;
    AND salary.wrdaily = .f. AND NOT employee.probation;
    AND NOT EMPTY(salary.dwratem)

    REPLACE pbldays WITH mPblDysS
    

    CASE salary.mpay = .f. ;
    AND salary.wrdaily = .f. AND employee.probation;
    AND NOT EMPTY(salary.dwratem)

    REPLACE pbldays WITH mPblDysP
    

    OTHERWISE

    REPLACE pbldays WITH mPblDysW
    

    ENDCASE

    REPLACE saldtail.days WITH pbldays

    RETURN .T.



    PROCEDURE Ord1


    STORE RECNO() TO mRecord
    WAIT WINDOW “Changing Order to Attendence Wise” TIMEOUT 1
    SET INDEX TO attend.cdx
    SET ORDER TO empno
    KEYBOARD ‘{PGUP}’
    KEYBOARD ‘{PGUP}’
    GOTO mRecord

    RETURN



    PROCEDURE Ord2


    STORE RECNO() TO mRecord
    WAIT WINDOW “Changing Order to Emp. No. Wise” TIMEOUT 1
    SET INDEX TO attend.cdx
    SET ORDER TO empno2
    KEYBOARD ‘{PGUP}’
    KEYBOARD ‘{PGUP}’
    GOTO mRecord

    RETURN



    PROCEDURE Ord3


    STORE RECNO() TO mRecord
    WAIT WINDOW “Changing Order to Name Wise” TIMEOUT 1

    INDEX ON employee.name TO atname.idx
    SET INDEX TO atname.idx

    KEYBOARD ‘{PGUP}’
    KEYBOARD ‘{PGUP}’
    GOTO mRecord

    RETURN



    PROCEDURE endprog


    CLEAR
    CLOSE DATABASES
    CLEAR WINDOWS
    *SHOW POPUP mainmenu

    IF _DOS
    RESTORE SCREEN FROM backgrnd
    ENDIF

    RETURN


    ATNDV3.PRG

    • This update: 22-Sep-2017

    clear
    @ 0,0,21,79 BOX
    DEFINE WINDOW bratnd FROM 1,1 TO 20,78

    SET VIEW TO attend

    BROWS FIELDS;
    Ename = employee.name :H = “Employee Name”,;
    L1 = “³” :1 :R :H = “”,;
    D1 :H = “1 “,;
    D2 :H = “2 “,;
    D3 :H = “3 “,;
    D4 :H = “4 “,;
    D5 :H = “5 “,;
    D6 :H = “6 “,;
    D7 :H = “7 “,;
    D8 :H = “8 “,;
    D9 :H = “9 “,;
    D10 :H = “10”,;
    D11 :H = “11”,;
    D12 :H = “12”,;
    D13 :H = “13”,;
    D14 :H = “14”,;
    D15 :H = “15”,;
    D16 :H = “16”,;
    D17 :H = “17”,;
    D18 :H = “18”,;
    D19 :H = “19”,;
    D20 :H = “20”,;
    D21 :H = “21”,;
    D22 :H = “22”,;
    D23 :H = “23”,;
    D24 :H = “24”,;
    D25 :H = “25”,;
    D26 :H = “26”,;
    D27 :H = “27”,;
    D28 :H = “28”,;
    D29 :H = “29”,;
    D30 :H = “30”,;
    D31 :H = “31”;
    WINDOW bratnd;
    WHEN below();
    TITLE “Daily Attendence Register”;
    NOAPPEND NOEDIT

    CLEAR ALL
    CLEAR
    CANCEL

    RETURN

    PROCEDURE below

    @ 22,2 SAY deptcode
    @ 22,4 SAY “-“
    @ 22,5 SAY empno PICT “@L”

    @ 22,9 SAY employee.salutation+”.”
    @ 22,12 SAY employee.name
    @ 22,35 SAY deptt.deptname

    RETURN

    ATNDVIEW.PRG

    • this update: 22-Sep-2017

    clear
    DEFINE WINDOW fullview FROM 0,0 TO 24,79
    SET VIEW TO attend

    BROWS FIELDS;
    Ename = employee.name :H = “Employee Name”,;
    L1 = “³” :1 :R :H = “”,;
    D1;
    WINDOW fullview;
    TITLE “Daily Attendence Register”

    ATSHEET.PRG

    CLOSE DATA

    CLEA
    SET TALK OFF
    SET SAFETY OFF

    SELECT 1
    USE attend ORDER empno

    SELECT 2
    USE employee ORDER empno

    SELECT 3
    USE ovtime ORDER empno3

    SELECT 4
    USE artime ORDER empno2

    SELECT 5
    USE deptt ORDER deptcode

    SELECT 6
    USE month ORDER mcode

    SELECT 1
    SET RELATION TO str(deptcode)+str(empno) INTO employee ADDITIVE
    SET RELATION TO str(deptcode)+str(atord)+str(empno) INTO ovtime ADDITIVE
    SET RELATION TO str(deptcode)+str(empno) INTO artime ADDITIVE
    SET RELATION TO deptcode INTO deptt ADDITIVE
    SET RELATION TO mcode INTO month ADDITIVE

    CLEAR

    PUBLIC Vp
    Vp = space(1)

    @ 11,19 SAY “Report to Printer or View (P/V) ? “
    @ ROW(),COL() GET Vp PICT “@!” VALID INLIST(Vp,’P’,’V’);
    ERROR “(P)rinter,(V)iew “
    READ

    DO CASE

    CASE Vp = "P"
    
        ??? CHR(15)
        ??? CHR(15)
    
        REPORT FORM ATsheet.FRX TO PRINTER NOEJECT
    
    CASE Vp = "V"
    
        REPORT FORM ATsheet.FRX PREVIEW
    

    ENDCASE

    CLEAR
    CLOSE DATA

    ATSHEET2.PRG

    • This Update: 22-Sep-2017

    CLOSE DATA
    CLEA
    SET TALK OFF
    SET SAFETY OFF

    SELECT 1
    USE attend ORDER empno

    SELECT 2
    USE employee ORDER empno

    SELECT 3
    USE ovtime ORDER empno3

    SELECT 4
    USE artime ORDER empno2

    SELECT 5
    USE deptt ORDER deptcode

    SELECT 6
    USE month ORDER mcode

    SELECT 1
    SET RELATION TO str(deptcode)+str(empno) INTO employee ADDITIVE
    SET RELATION TO str(deptcode)+str(atord)+str(empno) INTO ovtime ADDITIVE
    SET RELATION TO str(deptcode)+str(empno) INTO artime ADDITIVE
    SET RELATION TO deptcode INTO deptt ADDITIVE
    SET RELATION TO mcode INTO month ADDITIVE

    CLEAR

    PUBLIC Vp
    Vp = space(1)

    @ 11,19 SAY “Report to Printer or View (P/V) ? “
    @ ROW(),COL() GET Vp PICT “@!” VALID INLIST(Vp,’P’,’V’);
    ERROR “(P)rinter,(V)iew “
    READ

    DO CASE

    CASE Vp = "P"
    
        ??? CHR(15)
        ??? CHR(15)
    
        REPORT FORM ATsheet2.FRX TO PRINTER NOEJECT
    
    CASE Vp = "V"
    
        REPORT FORM ATsheet2.FRX PREVIEW
    

    ENDCASE

    CLEAR
    CLOSE DATA

    ATSHEET3.PRG

    CLOSE DATA
    CLEA
    SET TALK OFF
    SET SAFETY OFF

    SELECT 1
    USE attend ORDER empno

    SELECT 2
    USE employee ORDER empno

    SELECT 3
    USE ovtime ORDER empno3

    SELECT 4
    USE artime ORDER empno2

    SELECT 5
    USE deptt ORDER deptcode

    SELECT 6
    USE month ORDER mcode

    SELECT 1
    SET RELATION TO str(deptcode)+str(empno) INTO employee ADDITIVE
    SET RELATION TO str(deptcode)+str(atord)+str(empno) INTO ovtime ADDITIVE
    SET RELATION TO str(deptcode)+str(empno) INTO artime ADDITIVE
    SET RELATION TO deptcode INTO deptt ADDITIVE
    SET RELATION TO mcode INTO month ADDITIVE

    CLEAR

    PUBLIC Vp
    Vp = space(1)

    @ 11,19 SAY “Report to Printer or View (P/V) ? “
    @ ROW(),COL() GET Vp PICT “@!” VALID INLIST(Vp,’P’,’V’);
    ERROR “(P)rinter,(V)iew “
    READ

    DO CASE

    CASE Vp = "P"
    
        ??? CHR(15)
        ??? CHR(15)
    
        REPORT FORM ATsheet3.FRX TO PRINTER NOEJECT
    
    CASE Vp = "V"
    
        REPORT FORM ATsheet3.FRX PREVIEW
    

    ENDCASE

    CLEAR
    CLOSE DATA

    ATSHEET4.PRG

    CLOSE DATA
    CLEA
    SET TALK OFF
    SET SAFETY OFF

    SELECT 1
    USE attend ORDER empno

    SELECT 2
    USE employee ORDER empno

    SELECT 3
    USE ovtime ORDER empno3

    SELECT 4
    USE artime ORDER empno2

    SELECT 5
    USE deptt ORDER deptcode

    SELECT 6
    USE month ORDER mcode

    SELECT 1
    SET RELATION TO str(deptcode)+str(empno) INTO employee ADDITIVE
    SET RELATION TO str(deptcode)+str(atord)+str(empno) INTO ovtime ADDITIVE
    SET RELATION TO str(deptcode)+str(empno) INTO artime ADDITIVE
    SET RELATION TO deptcode INTO deptt ADDITIVE
    SET RELATION TO mcode INTO month ADDITIVE

    CLEAR

    PUBLIC Vp
    Vp = space(1)

    @ 11,19 SAY “Report to Printer or View (P/V) ? “
    @ ROW(),COL() GET Vp PICT “@!” VALID INLIST(Vp,’P’,’V’);
    ERROR “(P)rinter,(V)iew “
    READ

    DO CASE

    CASE Vp = "P"
    
        REPORT FORM ATsheet4.FRX TO PRINTER NOEJECT
    
    CASE Vp = "V"
    
        REPORT FORM ATsheet4.FRX PREVIEW
    

    ENDCASE

    CLEAR
    CLOSE DATA

    BACKGRND.PRG

    • ÖÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ·
    • º º
    • º 11/18/95 BACKGRND.SPR 17:42:11 º
    • º º
    • ÇÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄĶ
    • º º
    • º Author’s Name º
    • º º
    • º Copyright (c) 1995 Company Name º
    • º Address º
    • º City, Zip º
    • º º
    • º Description: º
    • º This program was automatically generated by GENSCRN. º
    • º º
    • ÓÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄĽ

    REGION 0

    REGIONAL m.currarea, m.talkstat, m.compstat

    IF SET(“TALK”) = “ON”
    SET TALK OFF
    m.talkstat = “ON”
    ELSE
    m.talkstat = “OFF”
    ENDIF
    m.compstat = SET(“COMPATIBLE”)
    SET COMPATIBLE FOXPLUS

    • ÖÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ·
    • º º
    • º MS-DOS Window definitions º
    • º º
    • ÓÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄĽ
      *
    • ÖÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ·
    • º º
    • º BACKGRND/MS-DOS Screen Layout º
    • º º
    • ÓÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄĽ
      *

    REGION 1

    @ 24,77 SAY “°°°” ;
    SIZE 1,3, 0
    @ 1,0 SAY “°°” ;
    SIZE 1,2, 0
    @ 1,2 SAY “°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°” ;
    SIZE 1,75, 0
    @ 2,0 SAY “°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°” ;
    SIZE 1,58, 0
    @ 3,0 SAY “°°” ;
    SIZE 1,2, 0
    @ 3,2 SAY “°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°” ;
    SIZE 1,75, 0
    @ 4,0 SAY “°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°” ;
    SIZE 1,58, 0
    @ 5,0 SAY “°°” ;
    SIZE 1,2, 0
    @ 5,2 SAY “°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°” ;
    SIZE 1,75, 0
    @ 6,0 SAY “°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°” ;
    SIZE 1,58, 0
    @ 7,0 SAY “°°” ;
    SIZE 1,2, 0
    @ 7,2 SAY “°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°” ;
    SIZE 1,75, 0
    @ 8,0 SAY “°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°” ;
    SIZE 1,58, 0
    @ 9,0 SAY “°°” ;
    SIZE 1,2, 0
    @ 9,2 SAY “°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°” ;
    SIZE 1,75, 0
    @ 10,0 SAY “°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°” ;
    SIZE 1,58, 0
    @ 11,0 SAY “°°” ;
    SIZE 1,2, 0
    @ 11,2 SAY “°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°” ;
    SIZE 1,75, 0
    @ 12,0 SAY “°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°” ;
    SIZE 1,58, 0
    @ 13,0 SAY “°°” ;
    SIZE 1,2, 0
    @ 13,2 SAY “°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°” ;
    SIZE 1,75, 0
    @ 14,0 SAY “°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°” ;
    SIZE 1,58, 0
    @ 15,0 SAY “°°” ;
    SIZE 1,2, 0
    @ 15,2 SAY “°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°” ;
    SIZE 1,75, 0
    @ 16,0 SAY “°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°” ;
    SIZE 1,58, 0
    @ 17,0 SAY “°°” ;
    SIZE 1,2, 0
    @ 17,2 SAY “°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°” ;
    SIZE 1,75, 0
    @ 18,0 SAY “°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°” ;
    SIZE 1,58, 0
    @ 19,0 SAY “°°” ;
    SIZE 1,2, 0
    @ 19,2 SAY “°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°” ;
    SIZE 1,75, 0
    @ 0,58 SAY “°°°°°°°°°°°°°°°°°°°” ;
    SIZE 1,19, 0
    @ 2,58 SAY “°°°°°°°°°°°°°°°°°°°” ;
    SIZE 1,19, 0
    @ 4,58 SAY “°°°°°°°°°°°°°°°°°°°” ;
    SIZE 1,19, 0
    @ 6,58 SAY “°°°°°°°°°°°°°°°°°°°” ;
    SIZE 1,19, 0
    @ 8,58 SAY “°°°°°°°°°°°°°°°°°°°” ;
    SIZE 1,19, 0
    @ 10,58 SAY “°°°°°°°°°°°°°°°°°°°” ;
    SIZE 1,19, 0
    @ 12,58 SAY “°°°°°°°°°°°°°°°°°°°” ;
    SIZE 1,19, 0
    @ 14,58 SAY “°°°°°°°°°°°°°°°°°°°” ;
    SIZE 1,19, 0
    @ 16,58 SAY “°°°°°°°°°°°°°°°°°°°” ;
    SIZE 1,19, 0
    @ 18,58 SAY “°°°°°°°°°°°°°°°°°°°” ;
    SIZE 1,19, 0
    @ 20,0 SAY “°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°” ;
    SIZE 1,77, 0
    @ 21,0 SAY “°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°” ;
    SIZE 1,77, 0
    @ 22,0 SAY “°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°” ;
    SIZE 1,77, 0
    @ 23,1 SAY “°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°” ;
    SIZE 1,77, 0
    @ 0,77 SAY “°°°” ;
    SIZE 1,3, 0
    @ 1,77 SAY “°°°” ;
    SIZE 1,3, 0
    @ 2,77 SAY “°°°” ;
    SIZE 1,3, 0
    @ 3,77 SAY “°°°” ;
    SIZE 1,3, 0
    @ 4,77 SAY “°°°” ;
    SIZE 1,3, 0
    @ 5,77 SAY “°°°” ;
    SIZE 1,3, 0
    @ 6,77 SAY “°°°” ;
    SIZE 1,3, 0
    @ 7,77 SAY “°°°” ;
    SIZE 1,3, 0
    @ 8,77 SAY “°°°” ;
    SIZE 1,3, 0
    @ 9,77 SAY “°°°” ;
    SIZE 1,3, 0
    @ 10,77 SAY “°°°” ;
    SIZE 1,3, 0
    @ 11,77 SAY “°°°” ;
    SIZE 1,3, 0
    @ 12,77 SAY “°°°” ;
    SIZE 1,3, 0
    @ 13,77 SAY “°°°” ;
    SIZE 1,3, 0
    @ 14,77 SAY “°°°” ;
    SIZE 1,3, 0
    @ 15,77 SAY “°°°” ;
    SIZE 1,3, 0
    @ 16,77 SAY “°°°” ;
    SIZE 1,3, 0
    @ 17,77 SAY “°°°” ;
    SIZE 1,3, 0
    @ 18,77 SAY “°°°” ;
    SIZE 1,3, 0
    @ 19,77 SAY “°°°” ;
    SIZE 1,3, 0
    @ 20,77 SAY “°°°” ;
    SIZE 1,3, 0
    @ 21,77 SAY “°°°” ;
    SIZE 1,3, 0
    @ 22,77 SAY “°°°” ;
    SIZE 1,3, 0
    @ 23,77 SAY “°°°” ;
    SIZE 1,3, 0
    @ 22,22 SAY “Designed & Developed by Amjad Izhar” ;
    SIZE 1,35, 0
    @ 0,4 SAY “°°°°°°°°°°°° P°°° A°°° Y°°° R°°° O°°° L°°° L°°°°°°°°°°°°°°°°°°°°°°°°°°°°” ;
    SIZE 1,72, 0
    @ 0,0 SAY “°°” ;
    SIZE 1,2, 0
    @ 0,2 SAY “°°” ;
    SIZE 1,2, 0
    @ 24,0 SAY “°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°” ;
    SIZE 1,77, 0
    @ 23,0 SAY “°” ;
    SIZE 1,1, 0

    REGION 0

    IF m.talkstat = “ON”
    SET TALK ON
    ENDIF
    IF m.compstat = “ON”
    SET COMPATIBLE ON
    ENDIF

    BACKGRWN.PRG

    • *
    • *
    • * 09/03/96 BACKGRWN.SPR 12:44:18
    • *
    • *
    • *
    • * Author’s Name
    • *
    • * Copyright (c) 1996 Company Name
    • * Address
    • * City, Zip
    • *
    • * Description:
    • * This program was automatically generated by GENSCRN.
    • *
    • *

    REGION 0

    REGIONAL m.currarea, m.talkstat, m.compstat

    IF SET(“TALK”) = “ON”
    SET TALK OFF
    m.talkstat = “ON”
    ELSE
    m.talkstat = “OFF”
    ENDIF
    m.compstat = SET(“COMPATIBLE”)
    SET COMPATIBLE FOXPLUS

    m.rborder = SET(“READBORDER”)
    SET READBORDER ON

    m.currarea = SELECT()

    • *
    • *
    • * Windows Window definitions
    • *
    • *
      *

    IF _DOS
    MODIFY WINDOW SCREEN ;
    AT 0.000, 0.000 ;
    SIZE 30.769,125.000 ;
    FONT “MS Sans Serif”, 8 ;
    NOFLOAT ;
    NOCLOSE ;
    NOMINIMIZE ;
    FILL FILE LOCFILE(“REDBRICK.BMP”,”BMP|ICO|PCT|ICN”, ;
    “Where is redbrick?”)
    ENDIF

    CLEAR

    • *
    • *
    • * BACKGRWN/Windows Screen Layout
    • *
    • *
      *

    REGION 1

    IF _DOS
    @ 27.308,2.000 SAY (LOCFILE(“copyrite.bmp”,”BMP|ICO|PCT|ICN”, “Where is copyrite?” )) BITMAP ;
    SIZE 1.615,4.200 ;
    STYLE “T”
    ENDIF

    DO top IN tbl_proc.PRG
    DO bot IN tbl_proc.PRG

    @ 11,58 SAY “P A Y R O L L – M A I N M E N U” FONT ‘FoxFont’,11
    @ 37,141 SAY “P a y r o l l” FONT “Times New Roman”, 14 STYLE “BIT”

    *@ 25.769,6.800 SAY “Designed & Developed By: Amjad Izhar. amjad18@yahoo.com” ;

    • FONT “Busorama Md BT”, 10 ;
    • STYLE “BT” ;
    • COLOR RGB(0,255,0,,,,)

    *@ 27.462,7.000 SAY “Dada Industries. 2015-16” ;

    • FONT “Photina”, 12 ;
    • STYLE “BT” ;
    • COLOR RGB(255,255,0,,,,)

    SELECT (m.currarea)

    REGION 0

    SET READBORDER &rborder

    IF m.talkstat = “ON”
    SET TALK ON
    ENDIF
    IF m.compstat = “ON”
    SET COMPATIBLE ON
    ENDIF

    BACKUP.PRG

    !PKZIP DBFS.ZIP *.DBF
    !PKZIP CDX.ZIP *.CDX
    !PKZIP FPT.ZIP *.FPT
    !PKZIP PRGS.ZIP *.PRG

    BHM_PROC.PRG


    • PROGRAM: BHM_PROC.PRG
    • Author: Amjad Izhar
    • Budget Heads Maintenance
    • Revised Again On : 18-01-2001

    • 1 – Budget Heads ….. Creation budg_ent
    • 2 – Budget Heads ….. Printing/Display budg_prt

    • 1 – Budget Heads ….. Creation budg_ent *

    PROCEDURE budg_ent


    CLEAR
    CLOSE ALL
    SET CONFIRM OFF

    IF _DOS
    SET COLOR TO 7/1
    ENDIF

    SELECT 1
    USE ldgrcode ORDER ac1

    SELECT 3
    USE chart ORDER crt

    STORE 0 TO MC1, MC2, MC3
    DO WHILE .T.
    CLEAR
    DO top IN tbl_proc.prg

    IF _DOS
    SET COLOR TO +7/1
    ENDIF

    @ 6, 25 SAY ‘Budget Maintenance Entry ‘

    IF _DOS
    SET COLOR TO 7/1
    ENDIF

    @ 23, 1 TO 23, 79
    SELECT 1

    IF _DOS
    SET COLOR TO 7/1
    ENDIF

    @ 24, 51 SAY ‘Press Ctrl Q To Quit ‘
    @ 8, 8 SAY ‘Ledger Head Code ‘

    IF _DOS
    SET COLOR TO /w
    ENDIF

    @ 8, 30 SAY ‘ – – ‘
    @ 8, 30 GET MC1 PICTURE ‘@z 99’

    IF _DOS
    SET COLOR TO 7/1
    ENDIF

    READ
    IF READKEY()=12
    CLEAR
    CLOSE ALL
    SET CONFIRM OFF
    RETURN
    ENDIF
    @ 24, 50 CLEAR TO 24, 78
    IF MC1=0
    LOOP
    ENDIF
    SELECT 3
    SET FILTER TO MC1>=FR.and.MC1<=TO GOTO TOP IF MC1>=FR.and.MC1<=TO
    SEEK STR(FR,2)+STR(TO,2)
    IF FOUND()
    MCH= CHART
    ENDIF
    ENDIF
    SET FILTER TO
    SELECT 1
    IF MC1<10
    @ 24, 1 SAY ‘Code C1 less than 10 not allowed.’
    WAIT ”
    @ 24, 1
    LOOP
    ENDIF

    IF _DOS
    SET COLOR TO *+7/1
    ENDIF

    @ 8, 50 SAY MCH

    IF _DOS
    SET COLOR TO 7/1
    ENDIF

    IF MC1>99.and.MC1<100

    IF _DOS
    SET COLOR TO *+7/1
    ENDIF

      @ 8, 50 SAY 'Not Defined Head      '
    

    IF _DOS
    SET COLOR TO 7/1
    ENDIF

    ENDIF
    MPC1= REPLICATE(‘0’,2-LEN(LTRIM(STR(MC1))))+LTRIM(STR(MC1))

    IF _DOS
    SET COLOR TO /w
    ENDIF

    @ 8, 30 SAY MPC1
    @ 8, 33 GET MC2 PICTURE ‘@z 99’
    READ
    MPC2= REPLICATE(‘0’,2-LEN(LTRIM(STR(MC2))))+LTRIM(STR(MC2))
    @ 8, 33 SAY MPC2
    @ 8, 36 GET MC3 PICTURE ‘@z 999’
    READ
    MPC3= REPLICATE(‘0’,3-LEN(LTRIM(STR(MC3))))+LTRIM(STR(MC3))
    @ 8, 36 SAY MPC3

    IF _DOS
    SET COLOR TO 7/1
    ENDIF

    IF READKEY()=12
    CLOSE DATA
    CLEAR
    RETURN
    ENDIF
    SELECT 1
    STORE STR(MC1,2)+STR(MC2,2)+STR(MC3,3) TO MLCODE
    SEEK MLCODE
    IF .not. FOUND()
    @ 24, 15 SAY ‘This Code Does Not Exist — Please Re-try ‘
    WAIT ”
    @ 24, 8 CLEAR TO 24, 63
    LOOP
    ENDIF
    IF MC3=0
    @ 12, 1 CLEAR TO 22, 79
    @ 12, 8 SAY ‘ Note:- Three zeros at the end of the ledger code’
    @ 13, 8 SAY ‘ will make it a consolidation head i.e you’
    @ 14, 8 SAY ‘ will not be able to Post Transactions’
    @ 15, 8 SAY ‘ directly into this head.’
    @ 16, 8 SAY ‘ Hit any key to continue ……….’
    WAIT ”
    CLEAR
    LOOP
    ENDIF
    @ 10, 8 SAY ‘Title of Ledger Head ‘ GET TITLE
    CLEAR GETS
    IF SR_NO>1
    @ 14, 17 SAY ‘Transactions already exist for this ‘
    @ 15, 17 SAY ‘Ledger Head therefore you can only ‘
    @ 16, 17 SAY ‘make changes in the Title and cannot ‘
    @ 17, 17 SAY ‘make changes in the Budget Amount ‘
    WAIT ”
    CLEAR
    LOOP
    ENDIF
    IF SR_NO=1.and.C3<>0
    @ 12, 8 SAY ‘Budget Amount Rs. ‘ GET BUDGET PICTURE ‘999999999.99’
    READ
    ENDIF
    Q= ‘ ‘
    DO WHILE .not. Q$’YN’
    @ 24, 25 SAY ‘More Data Entry – Y/N’ GET Q FUNCTION ‘!’
    READ
    ENDDO
    IF Q=’N’
    CLEAR
    CLOSE ALL
    SET CONFIRM OFF
    RETURN
    ENDIF
    MC3= MC3+1
    ENDDO

    RETURN



    • 2 – Budget Heads ….. Printing/Display budg_prt *

    PROCEDURE budg_prt


    CLEAR
    CLOSE ALL
    USE ldgrcode ORDER ac1

    IF RECCOUNT()=0
    CLEAR
    @ 12, 12 SAY ‘No Ledger Heads Exist in Data File – Press any key to return to menu …. ‘
    WAIT ”
    CLEAR
    CLOSE ALL
    RETURN
    ENDIF
    P= ‘ ‘
    DO WHILE .not. P$’PSQ’
    @ 23, 45 SAY ‘Printer/Screen/Quit – P/S/Q ‘ GET P FUNCTION ‘!’
    READ
    ENDDO
    IF P=’Q’
    CLOSE ALL
    CLEAR
    RETURN
    ENDIF
    IF P=’S’
    CLEAR
    SET PRINTER OFF
    SET DEVICE TO SCREEN
    ELSE
    CLEAR
    PANS= ‘ ‘
    do PRNCHK in tbl_proc
    IF PANS=’Q’
    CLOSE ALL
    CLEAR
    RETURN
    ENDIF
    @ 11, 20 SAY ‘Please wait … Printing in progress ‘
    SET PRINTER ON
    SET DEVICE TO PRINTER
    ENDIF
    HEADING= .T.
    PAGE= 0
    DO WHILE .not. EOF()
    IF HEADING
    L= 3
    PAGE= PAGE+1
    IF P=’P’
    DO top_prt1 IN tbl_proc.prg
    @ 3, 15 SAY CHR(18)
    @ 3, 33 SAY ‘BUDGET HEADS’
    @ 4, 32 SAY ‘————–‘
    @ 4, 65 SAY ‘Page -‘
    @ 4, 71 SAY PAGE PICTURE ’99’
    L= L+1
    ELSE
    DO screen IN tbl_proc.prg
    @ 3, 30 SAY ‘BUDGET HEADS’
    L= L+1
    @ L, 30 SAY ‘————– Page – ‘
    @ L, 70 SAY PAGE PICTURE ‘999’
    ENDIF
    L= L+2
    @ L, 7 SAY ‘Code’
    @ L, 28 SAY ‘Title’
    @ L, 52 SAY ‘Budget’
    L= L+1
    @ L, 5 SAY REPLICATE(‘-‘,72)
    HEADING= .F.
    ENDIF
    IF C3=0
    SKIP
    LOOP
    ENDIF
    IF BUDGET=0
    SKIP
    LOOP
    ENDIF
    L= L+1
    IF C2=0.and.C3=0.and.RIGHT(STR(C1),1)=’0′
    L= L+1
    MPC1= REPLICATE(‘0’,2-LEN(LTRIM(STR(C1))))+LTRIM(STR(C1))
    @ L, 5 SAY MPC1
    @ L, 7 SAY ‘-‘
    MPC2= REPLICATE(‘0’,2-LEN(LTRIM(STR(C2))))+LTRIM(STR(C2))
    @ L, 8 SAY MPC2
    @ L, 10 SAY ‘-‘
    MPC3= REPLICATE(‘0’,3-LEN(LTRIM(STR(C3))))+LTRIM(STR(C3))
    @ L, 11 SAY MPC3
    @ L, 20 SAY TITLE
    MLEN= LEN(RTRIM(TITLE))
    L= L+1
    @ L, 5 SAY REPLICATE(‘-‘,15+MLEN)
    ENDIF
    IF C3=0.and.RIGHT(STR(C1),1)<>’0′
    L= L+1
    MPC1= REPLICATE(‘0’,2-LEN(LTRIM(STR(C1))))+LTRIM(STR(C1))
    @ L, 5 SAY MPC1
    @ L, 7 SAY ‘-‘
    MPC2= REPLICATE(‘0’,2-LEN(LTRIM(STR(C2))))+LTRIM(STR(C2))
    @ L, 8 SAY MPC2
    @ L, 10 SAY ‘-‘
    MPC3= REPLICATE(‘0’,3-LEN(LTRIM(STR(C3))))+LTRIM(STR(C3))
    @ L, 11 SAY MPC3
    @ L, 20 SAY TITLE
    ELSE
    IF C3<>0
    MPC1= REPLICATE(‘0’,2-LEN(LTRIM(STR(C1))))+LTRIM(STR(C1))
    @ L, 8 SAY MPC1
    @ L, 10 SAY ‘-‘
    MPC2= REPLICATE(‘0’,2-LEN(LTRIM(STR(C2))))+LTRIM(STR(C2))
    @ L, 11 SAY MPC2
    @ L, 13 SAY ‘-‘
    MPC3= REPLICATE(‘0’,3-LEN(LTRIM(STR(C3))))+LTRIM(STR(C3))
    @ L, 14 SAY MPC3
    @ L, 20 SAY TITLE
    ENDIF
    ENDIF
    @ L, 45 SAY BUDGET PICTURE ‘999,999,999.99’
    SKIP
    IF EOF()
    IF P=’P’
    EJECT
    SET PRINTER OFF
    SET DEVICE TO SCREEN
    ENDIF
    ENDIF
    IF P=’S’
    IF L>21
    @ 24, 15 SAY ”
    XYZ= ‘ ‘
    DO WHILE .not. XYZ$’CQ’
    SET CONFIRM OFF
    @ 24, 55 SAY ‘Continue/Quit – C/Q ‘ GET XYZ FUNCTION ‘!’
    READ
    ENDDO
    IF XYZ=’Q’
    CLEAR
    CLOSE ALL
    RETURN
    ENDIF
    CLEAR
    L= 3
    HEADING= .T.
    ENDIF
    ENDIF
    IF P=’P’
    IF L>56
    EJECT
    L= 3
    HEADING= .T.
    ENDIF
    ENDIF
    ENDDO
    IF P=’S’
    @ 24, 7 SAY ‘End of Screen Printing – Press any key to return to menu…. ‘
    WAIT ”
    ELSE
    EJECT
    SET PRINTER OFF
    SET DEVICE TO SCREEN
    ENDIF
    CLOSE ALL

    RETURN


  • Visual FoxPro and FoxPro for DOS Video Books

    Visual FoxPro and FoxPro for DOS Video Books

    Video books in my Library.

    Visual FoxPro 6 Language Reference by Microsoft

    Visual FoxPro 6 Language Reference by Microsoft

    Mastering FoxPro by Charles Siegel

    Mastering FoxPro by Charles Siegel

    Miriam Liskin Programming FoxPro 2.5 for DOS – Part – 1

    Miriam Liskin Programming FoxPro 2.5 for DOS – Part – 1

    Miriam Liskin Programming FoxPro 2.5 for DOS – Part – 2

    Miriam Liskin Programming FoxPro 2.5 for DOS – Part – 2

    Miriam Liskin Programming FoxPro 2.5 for DOS – Part – 3

    Miriam Liskin Programming FoxPro 2.5 for DOS – Part – 3

    Visual FoxPro 3 Codebook Yair Alan Griver

    Visual FoxPro 3 Codebook Yair Alan Griver

    FoxPro 2.6 for DOS Code Book by Yair Alan Griver

    FoxPro 2.6 for DOS Code Book by Yair Alan Griver

    Miriam Liskin Visual FoxPro Expert Solutions

    Miriam Liskin Visual FoxPro Expert Solutions

    Visual FoxPro 6 Programmer”s The Essential Guide

    Visual FoxPro 6 Programmer”s The Essential Guide

    Using Visual FoxPro 6 by Menachem Bazian

    Using Visual FoxPro 6 by Menachem Bazian

    Mastering Visual FoxPro 3 by Charles Siegel 1993

    Mastering Visual FoxPro 3 by Charles Siegel 1993

    The Revolutionary Guide To Visual FoxPro OOP Professional Development

    The Revolutionary Guide To Visual FoxPro OOP Professional Development

    Advanced Object Oriented Programming With Visual FoxPro 6 by Markus Eggar

    Advanced Object Oriented Programming With Visual FoxPro 6 by Markus Eggar

    Object Orientation In Visual FoxPro by Savannah Brentnall

    Object Orientation In Visual FoxPro by Savannah Brentnall

    Visual FoxPro 3 Unleashed by Menachem Bazian, Jim Booth, Jeb Long, Doug Norman

    Visual FoxPro 3 Unleashed by Menachem Bazian, Jim Booth, Jeb Long, Doug Norman
    Accounting Software General Ledger System GoldCoin FoxPro 2 6 for DOS
    Accounting Software Payroll System Attendance Salary Sheets Wages & other Reports
    Accounting Software GL System Reports Chart of Account Trial Balance and All other Reports
    Accounting Software GL System Chart of Accounts Level Three up to Balance Sheet Accounts
    Accounting Software General Ledger Chart of Accounts Level Three Accounts Part Two
    Accounting Software GL System Chart of Accounts Level Three Accounts Creation Part One
    Accounting Software General Ledger System Chart of Accounts Level Two Accounts Creation
    Accounting Software General Ledger System Chart of Accounts Level One Accounts Creation
    Accounting Software General Ledger System Chart of Accounts Ideas FoxPro and QuickBooks
    Accounting Software General Ledger System Voucher Entry
    Accounting Software General Ledger System Overview of Menus

    By Amjad Izhar
    Contact: amjad.izhar@gmail.com
    https://amjadizhar.blog

  • Visual FoxPro 7 Commands

    Visual FoxPro 7 Commands

    Supported Visual FoxPro SET Commands

    Unsupported Visual FoxPro Commands and Functions

    Symbols
    & Command

    Performs macro substitution.

    & VarName[.cExpression]

    Parameters

    & VarName Specifies the name of the variable or array element to reference in the macro substitution. Do not include the M. prefix that distinguishes variables from fields. Such inclusion causes a syntax error. The macro should not exceed the maximum statement length permitted in Visual FoxPro.

    A variable cannot reference itself recursively in macro substitution. For example, the following generates an error message:

    STORE '&gcX' TO gcX
    ? &gcX

    Macro substitution statements that appear in DO WHILE, FOR, and SCAN are evaluated only at the start of the loop and are not reevaluated on subsequent iterations. Any changes to the variable or array element that occur within the loop are not recognized. .cExpression The optional period (.) delimiter and .cExpression are used to append additional characters to a macro. cExpression appended to the macro with .cExpression can also be a macro. If cExpression is a property name, include an extra period (cExpression..PropertyName).

    Remarks

    Macro substitution treats the contents of a variable or array element as a character string literal. When an ampersand (&) precedes a character-type variable or array element, the contents of the variable or element replace the macro reference. You can use macro substitution in any command or function that accepts a character string literal.

    Tip   Whenever possible, use a name expression instead of macro substitution. A name expression operates like macro substitution. However, a name expression is limited to passing character strings as names. Use a name expression for significantly faster processing if a command or function accepts a name (a file name, window name, menu name, and so on). For additional information on name expressions, see Overview of the Language.

    While the following commands are acceptable:

    STORE 'customer' TO gcTableName
    STORE 'company'  TO gcTagName
    USE &gcTableName ORDER &gcTagName

    use a name expression instead:

    USE (gcTableName) ORDER (gcTagName)

    Macro substitution is useful for substituting a keyword in a command. In the following example, the TALK setting is saved to a variable so the setting can be restored later in the program. The original TALK setting is restored with macro substitution.

    Example

    STORE SET('TALK') TO gcSaveTalk
    SET TALK OFF
    *
    *  Additional program code
    *
    SET TALK &gcSaveTalk  && Restore original TALK setting

    && Command

    Indicates the beginning of a nonexecuting inline comment in a program file.

    && [Comments]

    Parameters

    Comments Indicates that inline comments follow. For example:

    STORE (20*12) TO gnPayments  && 20 years of monthly payments

    Inserting inline comments to denote the end of the IF … ENDIF, DO, and FOR … ENDFOR structured programming commands greatly improves the readability of programs.

    Remarks

    Place a semicolon (;) at the end of each comment line that continues to a following line. You cannot place && and a comment after the semicolon used to continue a command line to an additional line.

    Example

    NOTE  Initialize the page number;
       variable.
    STORE 1 to gnPageNum
    * Set up the loop
    DO WHILE gnPageNum <= 25  && loop 25 times
       gnPageNum = gnPageNum + 1
    ENDDO  && DO WHILE gnPageNum <= 25
    • * Command

    Indicates the beginning of a nonexecuting comment line in a program file.

    * [Comments]

    Parameters

    Comments Specifies the comment in the comment line. For example:

    *   This is a comment

    Remarks

    Place a semicolon (;) at the end of each comment line that continues to a following line.

    Example

    * Initialize the page number;
       variable.
    STORE 1 to gnPageNum
    * Set up the loop
    DO WHILE gnPageNum <= 25  && loop 25 times
       gnPageNum = gnPageNum + 1
    ENDDO  && DO WHILE gnPageNum <= 25

    ? | ?? Command

    ??? Command

    @ … BOX Command

    @ … CLASS Command

    @ … CLEAR Command

    @ … EDIT – Edit Boxes Command

    @ … FILL Command

    @ … GET – Check Boxes Command

    @ … GET – Combo Boxes Command

    @ … GET – Command Buttons Command

    @ … GET – List Boxes Command

    @ … GET – Option Buttons Command

    @ … GET – Spinners Command

    @ … GET – Text Boxes Command

    @ … GET – Transparent Buttons Command

    @ … MENU Command

    @ … PROMPT Command

    @ … SAY – Pictures & OLE Objects Command

    @ … SAY Command

    @ … SCROLL Command

    @ … TO Command

    \ | \ Command

    A
    ACCEPT Command

    ACTIVATE MENU Command

    ACTIVATE POPUP Command

    ACTIVATE SCREEN Command

    ACTIVATE WINDOW Command

    ADD CLASS Command

    ADD TABLE Command

    ALTER TABLE – SQL Command

    APPEND Command

    APPEND FROM ARRAY Command

    APPEND FROM Command

    APPEND GENERAL Command

    APPEND MEMO Command

    APPEND PROCEDURES Command

    ASSERT Command

    ASSIST Command

    AVERAGE Command

    B
    BEGIN TRANSACTION Command

    BLANK Command

    BROWSE Command

    BUILD APP Command

    BUILD DLL Command

    BUILD EXE Command

    BUILD MTDLL Command

    BUILD PROJECT Command

    C
    CALCULATE Command

    CALL Command

    CANCEL Command

    CD | CHDIR Command

    CHANGE Command

    CLEAR Commands

    CLOSE Commands

    CLOSE MEMO Command

    COMPILE Command

    COMPILE DATABASE Command

    COMPILE FORM Command

    CONTINUE Command

    COPY FILE Command

    COPY INDEXES Command

    COPY MEMO Command

    COPY PROCEDURES Command

    COPY STRUCTURE Command

    COPY STRUCTURE EXTENDED Command

    COPY TAG Command

    COPY TO ARRAY Command

    COPY TO Command

    COUNT Command

    CREATE CLASS Command

    CREATE CLASSLIB Command

    CREATE COLOR SET Command

    CREATE Command

    CREATE CONNECTION Command

    CREATE CURSOR – SQL Command

    CREATE DATABASE Command

    CREATE FORM Command

    CREATE FROM Command

    CREATE LABEL Command

    CREATE MENU Command

    CREATE PROJECT Command

    CREATE QUERY Command

    CREATE REPORT – Quick Report Command

    CREATE REPORT Command

    CREATE SCREEN – Quick Screen Command

    CREATE SCREEN Command

    CREATE SQL VIEW Command

    CREATE TABLE – SQL Command

    CREATE TRIGGER Command

    CREATE VIEW Command

    D
    DEACTIVATE MENU Command

    DEACTIVATE POPUP Command

    DEACTIVATE WINDOW Command

    DEBUG Command

    DEBUGOUT Command

    DECLARE – DLL Command

    DECLARE Command

    DEFINE BAR Command

    DEFINE BOX Command

    DEFINE CLASS Command

    DEFINE MENU Command

    DEFINE PAD Command

    DEFINE POPUP Command

    DEFINE WINDOW Command

    DELETE – SQL Command

    DELETE Command

    DELETE CONNECTION Command

    DELETE DATABASE Command

    DELETE FILE Command

    DELETE TAG Command

    DELETE TRIGGER Command

    DELETE VIEW Command

    DIMENSION Command

    DIR or DIRECTORY Command

    DISPLAY Command

    DISPLAY CONNECTIONS Command

    DISPLAY DATABASE Command

    DISPLAY DLLS Command

    DISPLAY FILES Command

    DISPLAY MEMORY Command

    DISPLAY OBJECTS Command

    DISPLAY PROCEDURES Command

    DISPLAY STATUS Command

    DISPLAY STRUCTURE Command

    DISPLAY TABLES Command

    DISPLAY VIEWS Command

    DO CASE … ENDCASE Command

    DO Command

    DO FORM Command

    DO WHILE … ENDDO Command

    DOEVENTS Command

    DROP TABLE Command

    DROP VIEW Command

    E
    EDIT Command

    EJECT Command

    EJECT PAGE Command

    END TRANSACTION Command

    ERASE Command

    ERROR Command

    EXIT Command

    EXPORT Command

    EXTERNAL Command

    F
    FIND Command

    FLUSH Command

    FOR EACH … ENDFOR Command

    FOR … ENDFOR Command

    FREE TABLE Command

    FUNCTION Command

    G
    GATHER Command

    GETEXPR Command

    GO | GOTO Command

    H
    HELP Command

    HIDE MENU Command

    HIDE POPUP Command

    HIDE WINDOW Command

    I
    IF … ENDIF Command

    IMPORT Command

    INDEX Command

    INPUT Command

    INSERT – SQL Command

    INSERT Command

    J
    JOIN Command

    K
    KEYBOARD Command

    L
    LABEL Command

    LIST Commands

    LIST CONNECTIONS Command

    LIST DATABASE Command

    LIST DLLS Command

    LIST OBJECTS Command

    LIST PROCEDURES Command

    LIST TABLES Command

    LIST VIEWS Command

    LOAD Command

    LOCAL Command

    LOCATE Command

    LOOP Command

    LPARAMETERS Command

    M
    MD | MKDIR Command

    MENU Command

    MENU TO Command

    MODIFY CLASS Command

    MODIFY COMMAND Command

    MODIFY CONNECTION Command

    MODIFY DATABASE Command

    MODIFY FILE Command

    MODIFY FORM Command

    MODIFY GENERAL Command

    MODIFY LABEL Command

    MODIFY MEMO Command

    MODIFY MENU Command

    MODIFY PROCEDURE Command

    MODIFY PROJECT Command

    MODIFY QUERY Command

    MODIFY REPORT Command

    MODIFY SCREEN Command

    MODIFY STRUCTURE Command

    MODIFY VIEW Command

    MODIFY WINDOW Command

    MOUSE Command

    MOVE POPUP Command

    MOVE WINDOW Command

    N
    NOTE Command

    O
    ON BAR Command

    ON ERROR Command

    ON ESCAPE Command

    ON EXIT BAR Command

    ON EXIT MENU Command

    ON EXIT PAD Command

    ON EXIT POPUP Command

    ON KEY = Command

    ON KEY Command

    ON KEY LABEL Command

    ON PAD Command

    ON PAGE Command

    ON READERROR Command

    ON SELECTION BAR Command

    ON SELECTION MENU Command

    ON SELECTION PAD Command

    ON SELECTION POPUP Command

    ON SHUTDOWN Command

    OPEN DATABASE Command

    P
    PACK Command

    PACK DATABASE Command

    PARAMETERS Command

    PLAY MACRO Command

    POP KEY Command

    POP MENU Command

    POP POPUP Command

    PRINTJOB … ENDPRINTJOB Command

    PRIVATE Command

    PROCEDURE Command

    PUBLIC Command

    PUSH KEY Command

    PUSH MENU Command

    PUSH POPUP Command

    Q
    QUIT Command

    R
    RD | RMDIR Command

    READ Command

    READ EVENTS Command

    READ MENU Command

    RECALL Command

    REGIONAL Command

    REINDEX Command

    RELEASE BAR Command

    RELEASE CLASSLIB Command

    RELEASE Command

    RELEASE LIBRARY Command

    RELEASE MENUS Command

    RELEASE PAD Command

    RELEASE POPUPS Command

    RELEASE PROCEDURE Command

    RELEASE WINDOWS Command

    REMOVE CLASS Command

    REMOVE TABLE Command

    RENAME CLASS Command

    RENAME Command

    RENAME CONNECTION Command

    RENAME TABLE Command

    RENAME VIEW Command

    REPLACE Command

    REPLACE FROM ARRAY Command

    REPORT Command

    RESTORE FROM Command

    RESTORE MACROS Command

    RESTORE SCREEN Command

    RESTORE WINDOW Command

    RESUME Command

    RETRY Command

    RETURN Command

    ROLLBACK Command

    RUN | Command

    S
    SAVE MACROS Command

    SAVE SCREEN Command

    SAVE TO Command

    SAVE WINDOWS Command

    SCAN … ENDSCAN Command

    SCATTER Command

    SCROLL Command

    SEEK Command

    SELECT – SQL Command

    SELECT Command

    SET ALTERNATE Command

    SET ANSI Command

    SET ASSERTS Command

    SET AUTOSAVE Command

    SET BELL Command

    SET BLOCKSIZE Command

    SET BORDER Command

    SET BROWSEIME Command

    SET BRSTATUS Command

    SET CARRY Command

    SET CENTURY Command

    SET CLASSLIB Command

    SET CLEAR Command

    SET CLOCK Command

    SET COLLATE Command

    SET COLOR OF Command

    SET COLOR OF SCHEME Command

    SET COLOR SET Command

    SET COLOR TO Command

    SET Command

    SET COMPATIBLE Command

    SET CONFIRM Command

    SET CONSOLE Command

    SET COVERAGE Command

    SET CPCOMPILE Command

    SET CPDIALOG Command

    SET CURRENCY Command

    SET CURSOR Command

    SET DATABASE Command

    SET DATASESSION Command

    SET DATE Command

    SET DEBUG Command

    SET DEBUGOUT Command

    SET DECIMALS Command

    SET DEFAULT Command

    SET DELETED Command

    SET DELIMITERS Command

    SET DEVELOPMENT Command

    SET DEVICE Command

    SET DISPLAY Command

    SET DOHISTORY Command

    SET ECHO Command

    SET ESCAPE Command

    SET EVENTLIST Command

    SET EVENTTRACKING Command

    SET EXACT Command

    SET EXCLUSIVE Command

    SET FDOW Command

    SET FIELDS Command

    SET FILTER Command

    SET FIXED Command

    SET FORMAT Command

    SET FULLPATH Command

    SET FUNCTION Command

    SET FWEEK Command

    SET HEADINGS Command

    SET HELP Command

    SET HELPFILTER Command

    SET HOURS Command

    SET INDEX Command

    SET INTENSITY Command

    SET KEY Command

    SET KEYCOMP Command

    SET LIBRARY Command

    SET LOCK Command

    SET LOGERRORS Command

    SET MACKEY Command

    SET MARGIN Command

    SET MARK OF Command

    SET MARK TO Command

    SET MEMOWIDTH Command

    SET MESSAGE Command

    SET MULTILOCKS Command

    SET NEAR Command

    SET NOCPTRANS Command

    SET NOTIFY Command

    SET NULL Command

    SET NULLDISPLAY Command

    SET ODOMETER Command

    SET OLEOBJECT Command

    SET OPTIMIZE Command

    SET ORDER Command

    SET PALETTE Command

    SET PATH Command

    SET PDSETUP Command

    SET POINT Command

    SET PRINTER Command

    SET PROCEDURE Command

    SET READBORDER Command

    SET REFRESH Command

    SET RELATION Command

    SET RELATION OFF Command

    SET REPROCESS Command

    SET RESOURCE Command

    SET SAFETY Command

    SET SECONDS Command

    SET SEPARATOR Command

    SET SKIP Command

    SET SKIP OF Command

    SET SPACE Command

    SET STATUS BAR Command

    SET STATUS Command

    SET STEP Command

    SET STRICTDATE Command

    SET SYSFORMATS Command

    SET SYSMENU Command

    SET TALK Command

    SET TEXTMERGE Command

    SET TEXTMERGE DELIMITERS Command

    SET TOPIC Command

    SET TOPIC ID Command

    SET TRBETWEEN Command

    SET TYPEAHEAD Command

    SET UDFPARMS Command

    SET UNIQUE Command

    SET VIEW Command

    SET VOLUME Command

    SET WINDOW OF MEMO Command

    SHOW GET Command

    SHOW GETS Command

    SHOW MENU Command

    SHOW OBJECT Command

    SHOW POPUP Command

    SHOW WINDOW Command

    SIZE POPUP Command

    SIZE WINDOW Command

    SKIP Command

    SORT Command

    STORE Command

    SUM Command

    SUSPEND Command

    SYS(2001) – SET … Command Status

    T
    TEXT … ENDTEXT Command

    TOTAL Command

    TYPE Command

    U
    UNLOCK Command

    UPDATE – SQL Command

    UPDATE Command

    USE Command

    V
    VALIDATE DATABASE Command

    W
    WAIT Command

    WITH … ENDWITH Command

    X
    Y
    Z
    ZAP Command

    ZOOM WINDOW Command