|
Nelsom C. Smith <ncsmith@gate.net wrote:
>...
>I didn't use that method or the movel method for packed fields because I
>didn't want to have to choose between 900 different packed field sizes. For
>them, I just counted bits and put the numbers, decimal point, & sign
>directly into an alpha field. Every other type seems to work ok with the
>Movel (I haven't gotten to blobs yet, but I assume they will work like
>varchars).
>...
For packed, since the decimal point isn't really there, you really only need 30
different lengths to choose from to get a substringable (zoned) form, then you
could handle the decimal point and sign the same as you are already handling
zoned. You could also try the MI builtin _LBCPYNV which can convert from packed
to zoned (see example code below):
Blobs ... you need embedded SQL to get that data out. RPG itself can't see the
blob data.
Barbara Morris
----------------------------------------------------
Here's a little toy program I wrote a while ago that uses lbcpynv to convert
from packed to zoned:
D DPA_Template DS based(pDPA_Template)
D DPA_type 1A
D DPA_len 5I 0
D DPA_frac 1A overlay(DPA_len:1)
D DPA_digit 1A overlay(DPA_len:2)
D DPA_res 10i 0
D T_ZONED C x'02'
D T_PACKED C x'03'
D cpynv pr extproc('_LBCPYNV')
D tgtNum * VALUE
D tgtAttr LIKE(DPA_Template)
D srcNum * VALUE
D srcAttr LIKE(DPA_Template)
* If you are on V4R4 or later, you can use 3U 0 for the
* frac and digit values and set the values directly
* in the template without using this binchar stuff.
D ds
D bin 5i 0
D binchar 1a overlay(bin:2)
D packedDesc S LIKE(DPA_Template)
D zonedDesc S LIKE(DPA_Template)
* Sample data
D p DS
D pval 7P 3 inz(-1234.567)
D s DS
D sval 7S 3 inz(*hival)
* Setup the packed descriptor
C eval pDPA_Template = %addr(packedDesc)
C eval DPA_Template = *allx'00'
C eval DPA_Type = T_PACKED
* Setup the length part
C eval bin = %len(pval)
C eval DPA_digit = binChar
C eval bin = %decpos(pval)
C eval DPA_frac = binChar
* Setup the zoned descriptor like the packed one
C eval zonedDesc = packedDesc
C eval pDPA_Template = %addr(zonedDesc)
C eval DPA_Type = T_ZONED
* Convert from packed to zoned
C callp cpynv(%addr(s) : zonedDesc :
C %addr(p) : packedDesc)
* Debugger: ===> EVAL sval:x F1F2F3F4 F5F6D7
C return
From QSYSINC/MI H, members MICPTCOM and LBCPYNV:
typedef _Packed struct _DPA_Template_T {
/* Data Pointer Attr template */
char Type; /* Scalar type */
short Length; /* Scalar length: */
/* 0-7 = fractional digits */
/* (zoned or packed) */
/* 8-15 = total digits */
int reserved; /* reserved for future use */
/* and must be set to zero */
} _DPA_Template_T;
#define _T_SIGNED 0x00
#define _T_FLOAT 0x01
#define _T_ZONED 0x02
#define _T_PACKED 0x03
#define _T_CHAR 0x04
#define _T_ONLYNS 0x06
#define _T_ONLYN 0x07
#define _T_EITHER 0x08
#define _T_OPEN 0x09
#define _T_UNSIGNED 0x0A
void _LBCPYNV ( _SPCPTR, /* Receiver *
_DPA_Template_T *, /* Receiver attributes *
_SPCPTRCN, /* Source *
_DPA_Template_T * ); /* Source attributes *
+---
| This is the Midrange System Mailing List!
| To submit a new message, send your mail to MIDRANGE-L@midrange.com.
| To subscribe to this list send email to MIDRANGE-L-SUB@midrange.com.
| To unsubscribe from this list send email to MIDRANGE-L-UNSUB@midrange.com.
| Questions should be directed to the list owner/operator: david@midrange.com
+---
As an Amazon Associate we earn from qualifying purchases.
This mailing list archive is Copyright 1997-2025 by midrange.com and David Gibbs as a compilation work. Use of the archive is restricted to research of a business or technical nature. Any other uses are prohibited. Full details are available on our policy page. If you have questions about this, please contact [javascript protected email address].
Operating expenses for this site are earned using the Amazon Associate program and Google Adsense.