#include <idapi.h>
#include <stdio.h>
#include <windows.h>
DBIResult Chk(DBIResult);     // Prototyp funkce
void main ()
{
   hDBIDb    hDb = 0;         // Madlo k databázi
   hDBICur   hCur = 0;        // Madlo kurzoru
   CHAR      szTblName[DBIMAXNAMELEN];
   CHAR      szTblType[DBIMAXNAMELEN];
   CURProps  curProps;        // Vlastnosti kurzoru
   pBYTE     pRecBuf;// Ukazatel na vyrovnávací paměť záznamu
   DFLOAT    custNum;
   BOOL      isBlank;
   printf("\nInicializace BDE");
   Chk(DbiInit(NULL));
   printf("\nOtevření databáze");
   Chk(DbiOpenDatabase(
      NULL,         // Jméno databáze - NULL pro standardní databáze
      NULL,         // Typ databáze - NULL pro standardní databáze
      dbiREADWRITE, // Režim otevření - Read/Write nebo Read only
      dbiOPENSHARED,// Režim sdílení - Shared nebo Exclusive
      NULL,         // Heslo - není nutné pro standardní databáze
      NULL,         // Počet parametrů
      NULL,         // Pole deskriptorů pro parametry
      NULL,         // Hodnoty parametrů
      &hDb));       // Madlo k databázi
   printf("\nNastavení adresáře tabulky");
   Chk(DbiSetDirectory(
      hDb,                             // Madlo k databázi
      "e:\\bde32\\examples\\tables")); // Nový pracovní adresář
   printf("\nNastavení soukromého adresáře");
   Chk(DbiSetPrivateDir("c:\\temp"));
   strcpy(szTblName, "customer");
   strcpy(szTblType, szPARADOX);
   printf("\nOtevření tabulky");
   Chk(DbiOpenTable(
      hDb,           // Madlo standardní databáze
      szTblName,     // Jméno tabulky
      szTblType,     // Typ tabulky - pouze pro lokální tabulky
      NULL,          // Jméno indexu - Volitelné
      NULL,          // IndexTagName - Volitelné (pouze pro dBASE)
      0,             // IndexId - 0 = Primary
      dbiREADWRITE,  // Režim otevření - Read/Write nebo Read Only
      dbiOPENSHARED, // Režim sdílení - SHARED nebo EXCL
      xltFIELD,      // Překladový režim - většinou xltFIELD
      FALSE,         // Jednosměrný posuv kurzoru
      NULL,          // volitelné parametry
      &hCur));       // Madlo kurzoru
   printf("\nZískání vlastností kurzoru");
   Chk(DbiGetCursorProps(
      hCur,          // Madlo kurzoru
      &curProps));   // Vlastnosti kurzoru
   printf("\nAlokace vyrovnávací paměti záznamu");
   pRecBuf = (pBYTE) malloc(curProps.iRecBufSize * sizeof(BYTE));
   if (pRecBuf == NULL)
   {
      // Pokud pRecBuf je NULL, pak není dostatek paměti.
      // Chybu zde zpracujeme.
   }
   else
   {
      printf("\nNastavení kurzoru před první záznam");
      Chk(DbiSetToBegin(hCur));
      printf("\nZískání následujícího záznamu");
      Chk(DbiGetNextRecord(
         hCur,      // Kurzor ze kterého chceme získat záznam
         dbiNOLOCK, // Typ zámku
         pRecBuf,   // Vyrovnávací paměť pro uložení záznamu
         NULL));    // Vlastnosti záznamu - v našem případě nepoužito
      printf("\nZískání položky");
      Chk(DbiGetField(
         hCur,           // Kurzor obsahující záznam
         1,              // Číslo položky s Číslem zákazníka
         pRecBuf,        // Vyrovnávací paměť obsahující záznam
         (pBYTE)&custNum,// Proměnná pro číslo zákazníka
         &isBlank));     // Je položka prázdná?
      printf("\nHodnota získané položky je %f", custNum);
   }
   printf("\nÚklid");
   if (pRecBuf != NULL)
      free(pRecBuf);  // Uvolnění vyrovnávací paměti záznamu
   if (hCur != 0)
      Chk(DbiCloseCursor(&hCur));    // Uzavření kurzoru
   if (hDb != 0)
      Chk(DbiCloseDatabase(&hDb));   // Uzavření databáze
   DbiExit();   // Uzavření BDE.
}
DBIResult Chk(DBIResult ErrorValue)
{
  char        dbi_status[DBIMAXMSGLEN * 5] = {'\0'};
  DBIMSG      dbi_string = {'\0'};
  DBIErrInfo  ErrInfo;
  if (ErrorValue != DBIERR_NONE)
  {
    DbiGetErrorInfo(TRUE, &ErrInfo);
    if (ErrInfo.iError == ErrorValue)
    {
      wsprintf(dbi_status, "  ERROR %s", ErrInfo.szErrCode);
      if (strcmp(ErrInfo.szContext1, ""))
        wsprintf(dbi_status,"%s\r\n    %s",dbi_status, ErrInfo.szContext1);
      if (strcmp(ErrInfo.szContext2, ""))
        wsprintf(dbi_status,"%s\r\n    %s",dbi_status, ErrInfo.szContext2);
      if (strcmp(ErrInfo.szContext3, ""))
        wsprintf(dbi_status,"%s\r\n    %s",dbi_status, ErrInfo.szContext3);
      if (strcmp(ErrInfo.szContext4, ""))
        wsprintf(dbi_status,"%s\r\n    %s",dbi_status, ErrInfo.szContext4);
    }
    else
    {
      DbiGetErrorString(ErrorValue, dbi_string);
      wsprintf(dbi_status, "  ERROR %s", dbi_string);
    }
    MessageBox(NULL, dbi_status, "BDE Error", MB_OK | MB_ICONEXCLAMATION);
  }
  return ErrorValue;
}