#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;
}