Title: RE: Structure Problem

StructCopy() is only really a pointer to the original Structure.  If it isn't a nested structure, it will copy one level deep, otherwise it becomes a pointer.  If you are using CF4.0 and above, pretty sure, then you can use the Duplicate() function that Spectra uses to copy full structures.

HTH,

Robert

        :-----Original Message-----
        :From: Josh Meekhof [mailto:[EMAIL PROTECTED]]
        :Sent: Wednesday, April 04, 2001 12:36 PM
        :To: [EMAIL PROTECTED]
        :Subject: Structure Problem
        :
        :
        :I am building an application that is for entering
        :expenses. I am using
        :one template for accepting posted information.  This
        :template calls
        :another template to place this information into a set of nested
        :structures.  Then another template is called to validate the
        :information. Then I copy the original structure using
        :StructCopy(), and
        :I remove the invalid keys (using StructDelete()) from
        :my copy. My
        :problem is that the invalid keys are being removed
        :from both the copy
        :and the original structures. This is not how the
        :behavior is described
        :in the Cold Fusion manual.
        :
        :Any ideas?
        :
        :Code:
        :This is the cold that calls the converter:
        :-------------------------------------------------------
        :------------------------
        :<!--- convert the form values to something useful --->
        :  <cfmodule template="apiExpenseConverter.cfm"
        :stInput="request"            
        :            return="request.stExpenseIn">
        :<!--- I have placed all the time information into a
        :structure --->
        :
        :-------------------------------------------------------
        :-------------------------
        :
        :Converter Code:
        :<cfparam name="attributes.stInput">
        :<cfparam name="attributes.return" default="stExpense">
        :
        :<cfscript>
        :variables.expensePtr = StructNew();
        :
        :if ( NOT isStruct(attributes.stInput)) {
        :  evaluate("variables.expensePtr = #attributes.stInput#");
        :}
        :else {
        :  variables.expensePtr = attributes.stInput;
        :}
        :
        ://get all the keys from the expensePtr
        :variables.arKeys = StructKeyArray(variables.expensePtr);
        :
        ://create a structure for holding the converted expenses
        :variables.stExpense = StructNew();
        :
        :/*
        :  I only care about certain keys.  I will use a
        :regular Expression to
        :find
        :  extract this information.
       
        :  ExpenseDetail:
        :  detailDt_\d+_\d+
        :  description_\d+_\d+
        :  amount_\d+_\d+
        :  expenseTypeOID_\d+_\d+
        :
        :  ExpenseMaster:
        :  projectDesc_\d+
        :  wkEndingDt_\d+
        :*/
        :
        :for ( variables.i = ArrayLen(variables.arKeys);
        :variables.i GT 0;
        :variables.i = variables.i -1) {
        :  variables.stTmp =
        :REFindNoCase("(detaildt|description|amount|expensetypeo
        :id|projectdesc|wkendingdt)_(n?[[:digit:]]+)(_(n?[[:digi
        :t:]]+))?",
        :variables.arKeys[variables.i], 1, TRUE);
        :
        :  if ( variables.stTmp.len[1] ) {
        :    variables.strMasterOID = Mid(variables.arKeys[variables.i],
        :variables.stTmp.pos[3], variables.stTmp.len[3]);
        :    if (NOT StructKeyExists(variables.stExpense,
        :variables.strMasterOID)
        :) {
        :      StructInsert(variables.stExpense, variables.strMasterOID,
        :StructNew());
        :      StructInsert(variables.stExpense[variables.strMasterOID],
        :"DETAILS", StructNew());
        :    }
        :
        :    //look at the type and figure out what to do
        :   
        :    variables.strKey = mid(variables.arKeys[variables.i],
        :variables.stTmp.pos[2], variables.stTmp.len[2]);
        :
        :    if ( ArrayLen(variables.stTmp.len) EQ 5){ // this
        :is a detail
        :      variables.strDetailOID =
        :Mid(variables.arKeys[variables.i],
        :variables.stTmp.pos[5], variables.stTmp.len[5]);
        :
        :      if (NOT
        :StructKeyExists(variables.stExpense[variables.strMaster
        :OID]["DETAILS"],
        :variables.strDetailOID) )
        :      
        :StructInsert(variables.stExpense[variables.strMasterOID
        :]["DETAILS"],
        :variables.strDetailOID, StructNew());
        :     
        :    
        :StructInsert(variables.stExpense[variables.strMasterOID
        :]["DETAILS"][variables.strDetailOID],
        :variables.strKey, request[variables.arKeys[variables.i]]);
        :
        :    }
        :    else { //this is a master
        :      StructInsert(variables.stExpense[variables.strMasterOID],
        :variables.strKey, request[variables.arKeys[variables.i]]);
        :    }
        :  }
        :}
        :evaluate("caller." & attributes.return & " = StructNew()");
        :evaluate("caller." & attributes.return & " =
        :StructCopy(variables.stExpense)");
        :</cfscript>
        :
        :-------------------------------------------------------
        :--------------------------
        :
        :Back to the Calling template:
        :
        :<!--- verify the expense report --->
        :  <cfmodule name="cd.verifyexpensereport"
        :expensereport="request.stExpenseIn" return="request.stReturn">
        :Original1:
        :<cfmodule name="cd.objectdump" object="#request.stExpenseIn#">
        :
        :
        :
        :<cfset stValid = StructCopy(request["stExpenseIn"])>
        :
        :<cfset arinvalid = StructFindValue(request.stReturn,
        :'invalid', 'all')>
        :<cfloop from="1" to="#arraylen(arInvalid)#" index="i">
        :  <cfset variables.stRE =
        :REFindNoCase("\.(n[[:digit:]]+|[[:digit:]]+)\.(details)
        :\.(n[[:digit:]]+|[[:digit:]]+)\.([description|detaildt|
        :expensetypeoid|amount])",
        :        arinvalid[i]["path"], 1, true )>
        :  <cfset tmp =
        :structdelete(variables.stValid[mid(variables.arinvalid[
        :variables.i]["path"],
        :                                     
variables.stre["pos"][2],
        :                                     
variables.stre["len"][2])]
        :                 
        :[mid(variables.arinvalid[variables.i]["path"],
        :                       variables.stre["pos"][3],
        :                       variables.stre["len"][3])],
        :                 
        :mid(variables.arinvalid[variables.i]["path"],
        :                      variables.stre["pos"][4],
        :                      variables.stre["len"][4]))>
        :</cfloop>
        :--
        :Josh Meekhof
        :Software Engineer
        :Techniki Informatica / Network Staffing Services, Inc.
        :(972) 233-1525
        :
        :-------------------------------------------------------
        :------------------
        :This email server is running an evaluation copy of the
        :MailShield anti-
        :spam software. Please contact your email administrator
        :if you have any
        :questions about this message. MailShield product info:
www.mailshield.com

-----------------------------------------------
To post, send email to [EMAIL PROTECTED]
To subscribe / unsubscribe: http://www.dfwcfug.org

Reply via email to