Date: Fri, 17 Oct 2003 16:51:35 -0400
Reply-To: Howard Schreier <Howard_Schreier@ITA.DOC.GOV>
Sender: "SAS(r) Discussion" <SAS-L@LISTSERV.UGA.EDU>
From: Howard Schreier <Howard_Schreier@ITA.DOC.GOV>
Subject: Re: Looking for a better way of doing this - Setting two dataset
then retaining some fields ...
This technique for combining data from multiple datasets is usually called
interleaving rather than concatenation. The difference is the presence of a
BY statement.
I have used this approach for tasks generally resembling the one you
describe (reporting, where there are multiple sections for each "case").
It's a little hard to evaluate because you do not provide any sample data
and the code you show is incomplete (eg, a statement "============
_genltr;").
On Thu, 16 Oct 2003 18:09:31 -0700, Harmeet <hkalra@WEBGABLE.COM> wrote:
>I am looking for a better way of coding the following, if this is an
>average coding style then please let me know. I used to code in SAS
>then I did not code for last 4 years and now I am back. (I could not
>live without SAS.......:)
>
>I need to concatenate two datasets one has all the reqt numbers(REQT),
>customer address info and the invoice types - multiple records(one
>invoice type per record) and other dataset has all the invoice types
>printed in a dataset with request number information on every line of
>the invoice. I need to print one letter per request number with all
>the invoice types listed on the letter and then associated invoices
>behind the letter. In the invoice file INV I have: reqtno and
>invline(invoice line) and Linelength, invoice number and invoice line
>number:
>
>
>So there are multiple records per reqt number in the REQT file and
>there are multiple records in the INV file; invoice file does not have
>invoice type information it is already sorted in the request number
>and, invoice number and invoice line number.
>
>All the customer address related information is on every record in the
>REQT file. I need to retain the customer name, address information and
>then as soon as I get to the first invoice record for that request I
>need to generate the cover letter.
>
>
>This is kind of mailmerge:
>
>Here is the simplified skeleton ..........
>(I can have reqts without invoices. and I do have multiple templates
>for the letters ... ...)
>
>proc sort data=reqt;
> by reqtno invtype;
>
>proc sort data=inv;
> by reqtno invno invlnno;
>
>
>Data _null_
> retain cvlflag '0';
> set reqts(in=master)
> invoices (in=inv);
> by reqtno ;
>
> if master
> then do;
> if first.reqtno
> then do;
> cvrflag = 0
> Link _RETAIN;
> ===
> end;
> else do;
> code lines;
> end;
>
>
>** the last.reqtno is needed just incase there was no invoice for the
>** request number - I still need to gen the letter ---
>
> if last.reqtno
> then do;============
> _genltr;
> end;
>
> end;
>*** Now we are accessing Invoice related to the reqt ****;
> if inv
> then do;
> if cvlflag = 0;
> then link _genltr;
>
> put invline $varying Linelen.
>=====================
>
> end;
>
>return;
>
>_genltr:
>
>cvlflag=1;
>
>======
>return;
>
>
>_Retain:
>length _custnm _custad1 _custad2 _cusad3 $42;
>retain _custnm _custad1 _custad2 _cusad3 ' ';
>
>_custnm = custname;
>_cusad1 = custad1;
>_custad2 = custad2;
>
>
>===========
>
>return;
|