[comp.lang.pascal] Vax Pascal Problem

diblanch@sdrc.UUCP (Jeff Blanchet) (12/28/89)

I hope someone out there can help me. I am having a problem with an indexed
file. The file is a file of records that are quite large (Larger then I have
ever done before). 

The problem seems to be in the resetk command while using the error_recovery
parameter. The program just hangs on the resetk command and the process
begins page faulting like crazy. If I take out the error_recovery on the resetk
command it works fine. Any ideas?

What makes this problem worse is that it only occurs when the file does
not exist and I am creating it for the first time. I took out the error_recovery
to initial create the file. I then put the error_recovery back into the
program and it worked fine. I deleted the file, ran the executable with the
error_recovery and it hung. Please Help!!!

I am using the Pascal V3.9-289 compiler with the V05-05 linker.
I have include a copy of a test program that shows the problem I am having.
If anyone can help I would really appreciate it. 


----- cut here ----- cut here ----- cut here ----- cut here ----- cut here -----
PROGRAM Jeff (input,output);

CONST
   MAX_PROD_LINE = 120;		{ Max no of scrolled lines in buffer }


TYPE

   PACK_1 = PACKED ARRAY [1..1] OF CHAR;
   PACK_3 = PACKED ARRAY [1..3] OF CHAR;
   PACK_6 = PACKED ARRAY [1..6] OF CHAR;
   PACK_7 = PACKED ARRAY [1..7] OF CHAR;
   PACK_9 = PACKED ARRAY [1..9] OF CHAR;
   PACK_10 = PACKED ARRAY [1..10] OF CHAR;
   PACK_15 = PACKED ARRAY [1..15] OF CHAR;
   PACK_REGION       = PACKED ARRAY [1..4] OF CHAR;
   PACK_BRANCH       = PACKED ARRAY [1..4] OF CHAR;
   PACK_CO_ID        = PACKED ARRAY [1..10] OF CHAR;
   PACK_SITE_ID      = PACKED ARRAY [1..3] OF CHAR;
   PACK_PO           = PACKED ARRAY [1..25] OF CHAR;
   PACK_PR_NUMBER    = PACKED ARRAY [1..8] OF CHAR;
   PACK_RESTRICTED   = PACKED ARRAY [1..1] OF CHAR;
   PACK_MASTER       = PACKED ARRAY [1..8] OF CHAR;
   PACK_JOB_ID       = PACKED ARRAY [1..7] OF CHAR;
   PACK_OPER_SYS     = PACKED ARRAY [1..6] OF CHAR;
   SHIP_FORM_PACK = PACKED ARRAY[1..31] OF CHAR;
   SHIP_FORM_PACK_INST = PACKED ARRAY[1..33] OF CHAR;
   SHIP_FORM_DESC = PACKED ARRAY[1..55] OF CHAR; 
   SHIP_FORM_POC_PACK = PACKED ARRAY[1..9] OF CHAR;
   PACK_PROD_CODE    = PACKED ARRAY [1..10] OF CHAR;


  ITEM_REC = RECORD            
    LINE_ITEM         : PACK_3;
    QTY               : PACK_3;    
    PART_NO           : PACK_PROD_CODE;
    DESCRIPTION       : SHIP_FORM_DESC;
  END;                             


{ Anytime the BUFFER_REC definition changes then you must write a convert
  procdure for the orders.dat file (the online file copy of the shipping
  orders).} 

  BUFFER_REC = RECORD 
    DATE              : PACK_9;
    SALESMAN          : PACK_15;
    REGION            : PACK_REGION;
    BRANCH            : PACK_BRANCH;
    CUSTOMER_ID       : [key(1)] PACK_CO_ID;
    CUSTOMER_SITE_ID  : [key(2)] PACK_SITE_ID;
    CUSTOMER_ORDER_NO : [key(3)] PACK_PO;
    PROD_REQ_NO       : [key(4)] PACK_PR_NUMBER;
    PACK_COUNT        : PACK_3;
    SHIPPING_TOTAL    : PACK_1;
    SHIPMENT_DISP     : PACK_7;
    SHIP_VIA          : PACK_15;
    SHIPPING_TYPE     : PACK_1;
    SHIPPING_TYPE1    : PACK_6;
    CHARGE_NO         : PACK_15;
    RESTRICTED        : PACK_RESTRICTED;
    MASTER_LEASE      : PACK_MASTER;
    JOB_ID            : PACK_JOB_ID;
    SYSTEM            : PACK_OPER_SYS;
    SHIP_COUNTER      : [key(0)] PACK_10;
    CURR_PAGE         : PACK_1;
    TOT_PAGE          : PACK_1;
    SHIP_TO_1         : SHIP_FORM_PACK;
    SHIP_TO_2         : SHIP_FORM_PACK;
    SHIP_TO_3         : SHIP_FORM_PACK;
    SHIP_TO_4         : SHIP_FORM_PACK;
    SHIP_TO_5         : SHIP_FORM_PACK;
    SHIP_TO_6         : SHIP_FORM_PACK;
    SHIP_TO_7         : SHIP_FORM_PACK;
    END_USER_1        : SHIP_FORM_PACK;
    END_USER_2        : SHIP_FORM_PACK;
    END_USER_3        : SHIP_FORM_PACK;
    END_USER_4        : SHIP_FORM_PACK;
    END_USER_5        : SHIP_FORM_PACK;
    END_USER_6        : SHIP_FORM_PACK;
    END_USER_7        : SHIP_FORM_PACK;
    SPEC_INSTR_1      : SHIP_FORM_PACK_INST;
    SPEC_INSTR_2      : SHIP_FORM_PACK_INST;
    SPEC_INSTR_3      : SHIP_FORM_PACK_INST;
    SPEC_INSTR_4      : SHIP_FORM_PACK_INST;
    SPEC_INSTR_5      : SHIP_FORM_PACK_INST;
    SPEC_INSTR_6      : SHIP_FORM_PACK_INST;
    SPEC_INSTR_7      : SHIP_FORM_PACK_INST;
    SPEC_INSTR_8      : SHIP_FORM_PACK_INST;
    SPEC_INSTR_9      : SHIP_FORM_PACK_INST;
    MONTH_1           : PACK_3;
    MONTH_2           : PACK_3;
    MONTH_3           : PACK_3;
    ITEM              : ARRAY[1..MAX_PROD_LINE] OF ITEM_REC;
    POC_1 	      : ARRAY[1..MAX_PROD_LINE] OF SHIP_FORM_POC_PACK;
    POC_2             : ARRAY[1..MAX_PROD_LINE] OF SHIP_FORM_POC_PACK;
    POC_3             : ARRAY[1..MAX_PROD_LINE] OF SHIP_FORM_POC_PACK;
  END;


VAR
   buffer : buffer_rec;
   

PROCEDURE CLEAR_BUFFER(var buffer : buffer_rec);

{ Clear all fields in the buffer }
VAR
   i : integer;

BEGIN
WITH BUFFER DO 
   BEGIN   
     DATE := '';              SALESMAN := '';
     REGION := '';            BRANCH := '';
     CUSTOMER_ID := '';       CUSTOMER_SITE_ID := '';
     CUSTOMER_ORDER_NO := ''; PROD_REQ_NO := '';
     PACK_COUNT := '';        SHIPPING_TOTAL := '';
     SHIPMENT_DISP := '';     SHIP_VIA := '';
     SHIPPING_TYPE := '';     SHIPPING_TYPE1 := '';
     CHARGE_NO := '';         RESTRICTED := '';
     MASTER_LEASE := '';      JOB_ID := '';
     SHIP_TO_1 := '';         SHIP_TO_2 := '';
     SHIP_TO_3 := '';         SHIP_TO_4 := '';
     SHIP_TO_5 := '';         SHIP_TO_6 := '';
     SHIP_TO_7 := '';
     END_USER_1 := '';        END_USER_2 := '';
     END_USER_3 := '';        END_USER_4 := '';
     END_USER_5 := '';        END_USER_6 := '';
     END_USER_7 := '';
     SPEC_INSTR_1 := '';      SPEC_INSTR_2 := '';
     SPEC_INSTR_3 := '';      SPEC_INSTR_4 := '';
     SPEC_INSTR_5 := '';      SPEC_INSTR_6 := '';
     SPEC_INSTR_7 := '';      SPEC_INSTR_8 := '';
     SPEC_INSTR_9 := '';
     MONTH_1 := '';           MONTH_2 := '';
     MONTH_3 := '';
   END;

{ Clear the QTY, PROD_DESC, DESCRIPTION array }
FOR I:=1 TO MAX_PROD_LINE DO
 BEGIN        
   WITH BUFFER.ITEM[I] DO
    BEGIN 
      LINE_ITEM := '';
      QTY := '';
      PART_NO := '';
      DESCRIPTION := '';
    END;      
   BUFFER.POC_1[I] := '';    BUFFER.POC_2[I] := '';
   BUFFER.POC_3[I] := '';
 END;

END;
{******************************************************************************}
Procedure save_buffer_file(buffer : buffer_rec);
var
   outfile : file of buffer_rec;
begin
   open(outfile,'ORDERS.DAT',sharing := readwrite, access_method := keyed,
        organization := indexed, history := unknown);

(*THE FOLLOWING RESETK IS CAUSING THE PROBLEM. IT JUST HANGS. *)

   repeat
      resetk(outfile,0,error:=continue);
   until status(outfile) = 0;

(*COMMENTING OUT THE ABOVE THREE LINES AND USING THE ONE BELOW WORKS FINE *)

   (* resetk(outfile,0,error:=continue); *)

   repeat
      findk(outfile,0,buffer.ship_counter,eql,error:=continue);
   until status(outfile) = 0;
   if not ufb(outfile) then
   begin
      outfile^:=buffer;
      repeat
        update(outfile,error:=continue);
      until status(outfile) = 0;
   end
   else 
   begin
      outfile^:=buffer;
      repeat
         put(outfile,error:=continue);
      until status(outfile) = 0;
   end;
   close(outfile);
end;
{******************************************************************************}
begin
   clear_buffer(buffer);
   save_buffer_file(buffer);
end.
----- cut here ----- cut here ----- cut here ----- cut here ----- cut here -----

Jeff Blanchet           UUCP: uunet!sdrc!diblanch
SDRC
Cincinnati Ohio