HP3000-L Archives

August 2013, Week 1

HP3000-L@RAVEN.UTC.EDU

Options: Use Monospaced Font
Show Text Part by Default
Show All Mail Headers

Message: [<< First] [< Prev] [Next >] [Last >>]
Topic: [<< First] [< Prev] [Next >] [Last >>]
Author: [<< First] [< Prev] [Next >] [Last >>]

Print Reply
Subject:
From:
Michael Anderson <[log in to unmask]>
Reply To:
Michael Anderson <[log in to unmask]>
Date:
Sat, 3 Aug 2013 14:56:31 -0500
Content-Type:
text/plain
Parts/Attachments:
text/plain (186 lines)
UNSTRING mycsvrecord Delimited By "," into fld1 fld2 fld3 fld4 fld5.

Or something like that.... see docs.
Say fld4 is the number that you want to process, then :

Move function NUMVAL(fld4) to mypics9-8-v99.

If the numval function is not available, I have a subroutine that I've 
used for decades on the HP3000, originally written by JOE CHAMRAD,
  using HPCOBOL ANSI74, no inline performs, all GO TO Loops.
It goes like so:

01 num1 x(14)
01 num2 s9(14)
01 numdec s9(4) comp
01 numerr s9(4) comp

Move fld4 to num1
initialize num2 numdec numerr

Call "NUMGET" using num1 num2 numdec numerr.

So NUMGET, will convert num1 to num2, set numdec to the number of 
decimal places, and sets numerr to 0 or 1, 1 meaning that num1 was not a 
numeric string.
A valid numeric string would be "123.123" or "-123.123" or 
"+11,123.1230233", + - , . and 0-9 are allowed.

Then to convert to s9(8)V99:
If numerr = 0
    COMPUTE mypic9-8-v99 = (NUM2 / 10 ** NUMDEC).


NUMGET........

$CONTROL RLFILE,LIST,DYNAMIC,BOUNDS
  IDENTIFICATION DIVISION.
  PROGRAM-ID. NUMGET.
  AUTHOR.     JOE W CHAMRAD.
  DATE-COMPILED.

**************************************************************
* *
*  THIS SUBROUTINE CONVERTS THE NUMBERS AS ENTERED AT THE    *
*  TERMINAL INTO NUMERIC, SIGNED NUMBERS THAT CAN BE USED    *
*  IN THE PROGRAM.                                           *
* *
* PARAMETERS:                                               *
* *
*  NUM-1     A 14 CHARACTER FIELD CONTAINING THE NUMBER AS   *
*            THE OPERATOR TYPED IT.                          *
* *
*  NUM-2     THE 14 ASCII DIGIT SIGNED NUMERIC VALUE OF NUM-1*
*            THAT IS RETURNED.                               *
* *
*  N-DEC     AN INTEGER WHICH RETURNS THE NUMBER OF DECIMAL  *
*            PLACES FOUND IN THE NUMBER.                     *
* *
*  N-ERR     AN INTEGER WHICH RETURNS A 1 IF NUM-1 DID NOT   *
*            CONTAIN VALID NUMERIC INFORMATION OR RETURNS 0  *
*            IF A GOOD NUMBER WAS FOUND.                     *
* *
**************************************************************

  ENVIRONMENT DIVISION.

  CONFIGURATION SECTION.
  SOURCE-COMPUTER. HP3000.
  OBJECT-COMPUTER. HP3000.
$PAGE
  DATA DIVISION.
  WORKING-STORAGE SECTION.

  01  N                     PIC 9(4) COMP.
  01  N1                    PIC 9(4) COMP.
  01  N2                    PIC 9(4) COMP.
  01  DECIMAL-SW            PIC X.
  01  COMMA-SW              PIC X.
  01  MINUS-SW              PIC X.
  01  NUMERIC-EDITING.
      02  NUMERIC-1             PIC S9(9)V99 VALUE 0.
      02  FIX-NUM-1             PIC ----------9.99.
      02  FIXED-NUM-1 REDEFINES FIX-NUM-1 PIC X(14).

  LINKAGE SECTION.

  01  NUM-1.
      02  X1                PIC X  OCCURS 14 TIMES.

  01  NUM-2.
      02  X2                PIC X  OCCURS 14 TIMES.
  01  FILLER REDEFINES NUM-2.
      02  NUM-2N            PIC S9(14).

  01  N-DEC                 PIC 9(4) COMP.
  01  N-ERR                 PIC 9(4) COMP.
$PAGE
  PROCEDURE DIVISION USING NUM-1 NUM-2 N-DEC N-ERR.

  START-HERE.
      MOVE SPACES TO NUM-2.
      MOVE ZERO TO N-DEC N-ERR.
      MOVE 14 TO N.

  1ST-LOOP.
      IF N NOT = ZERO
          IF X1 (N) <= SPACE
              SUBTRACT 1 FROM N
              GO TO 1ST-LOOP.
      COMPUTE N1 = N + 1.
      MOVE 14 TO N2.
      MOVE "0" TO DECIMAL-SW COMMA-SW MINUS-SW.

  2ND-LOOP.
      SUBTRACT 1 FROM N1.
      IF N1 = ZERO GO TO FINISH-UP.
      IF X1 (N1) <= SPACE GO TO 2ND-LOOP.
      IF X1 (N1) = "-"
          IF MINUS-SW = "1"
              MOVE "1" TO N-ERR
              GO TO 2ND-LOOP
          ELSE
              MOVE "1" TO MINUS-SW
              GO TO 2ND-LOOP.
      IF X1 (N1) = ","
          MOVE "1" TO COMMA-SW
          GO TO 2ND-LOOP.
      IF X1 (N1) = "."
          IF DECIMAL-SW = "1" OR COMMA-SW = "1"
              MOVE 1 TO N-ERR
              GO TO 2ND-LOOP
          ELSE
              MOVE "1" TO DECIMAL-SW
              GO TO 2ND-LOOP.
      IF X1 (N1) LESS THAN "0" OR GREATER THAN "9"
          MOVE 1 TO N-ERR
          GO TO 2ND-LOOP.
      MOVE X1 (N1) TO X2 (N2).
      IF DECIMAL-SW NOT = "1" ADD 1 TO N-DEC.
      SUBTRACT 1 FROM N2.
      GO TO 2ND-LOOP.

  FINISH-UP.
      INSPECT NUM-2 REPLACING LEADING SPACES BY "0".
      IF MINUS-SW = "1" COMPUTE NUM-2N = - NUM-2N.
      IF DECIMAL-SW = "0" MOVE ZERO TO N-DEC.
      IF N-ERR NOT = ZERO
         MOVE ZERO TO NUM-2N N-DEC
      ELSE
         COMPUTE NUMERIC-1 = NUM-2N / 10 ** N-DEC
         MOVE NUMERIC-1 TO FIX-NUM-1
         MOVE FIXED-NUM-1 TO NUM-1.

  ALL-DONE.
      EXIT PROGRAM.
  END PROGRAM NUMGET.


On 08/03/2013 09:11 AM, Tony Girgenti wrote:
> Hello,
>
> I'm importing a CSV text file into a HP3000 COBOL II program.
>
> I want to compare a number field from the text file to a number in my COBOL program defined as S9(8)V99.
>
> The CSV text file numeric field looks like this including the quotes: "-312.97".
>
> The text file numeric field can vary in length as "-1,234.99" or "-123,456.99".
>
> If the CSV text file field is always the same length, I know I can move the text field to a COBOL numeric field that is redefined as AlphaNumeric.
>
> The problem is that the input text field can be different for each record.
>
> Does anybody know how to code this in COBOL to accommodate the different number sizes in the text file?
>
> Any help would be gratefully appreciated.
>
> Thanks,
> Tony
>
> * To join/leave the list, search archives, change list settings, *
> * etc., please visit http://raven.utc.edu/archives/hp3000-l.html *

* To join/leave the list, search archives, change list settings, *
* etc., please visit http://raven.utc.edu/archives/hp3000-l.html *

ATOM RSS1 RSS2