UDF исчезает - PullRequest
       3

UDF исчезает

0 голосов
/ 14 июня 2011

Я работаю над переносом группы данных из старой базы данных в новую. В процессе миграции создан UDF для моего скрипта, который даст мне кучу данных, которые мне нужны. Когда я запускаю цикл, который вызывает UDF несколько раз, я обнаруживаю, что первая итерация работает нормально, но затем UDF исчезает из следующих итераций.

Мой код:

<cffunction name="getCats" access="public">
    <cfargument name="assignments" type="any" />

    <cfquery name="getCats" datasource="pgdold">
        SELECT c1.id AS id1, c1.category AS name1, c2.id AS id2, c2.category AS name2, c3.id AS id3, c3.category AS name3, c4.id AS id4, c4.category AS name4, c5.id AS id5, c5.category AS name5
        FROM category c1
        LEFT JOIN category AS c2 ON c2.parentid = c1.id
        LEFT JOIN category AS c3 ON c3.parentid = c2.id
        LEFT JOIN category AS c4 ON c4.parentid = c3.id
        LEFT JOIN category AS c5 ON c5.parentid = c4.id
    </cfquery>

    <cfquery name="get" dbtype="query">
        SELECT (name1 + '/' + name2 + '/' + name3 + '/' + name4 + '/' + name5) AS category
        FROM getCats
        WHERE
            <cfloop query="Arguments.assignments">
                (id1 = #Arguments.assignments.categoryid# OR id2 = #Arguments.assignments.categoryid# OR id3 = #Arguments.assignments.categoryid# OR id4 = #Arguments.assignments.categoryid# OR id5 = #Arguments.assignments.categoryid#)
                <cfif Arguments.assignments.currentrow IS NOT Arguments.assignments.recordCount> OR </cfif>
            </cfloop>
    </cfquery>
    <cfreturn get />
</cffunction>

<cfscript>
    olddb = {datasource='pgdold'};

    a = new Query(argumentCollection=olddb);
    a.setSQL('SELECT * FROM products LIMIT 10');
    p = a.execute();
    pr = p.getResult();
</cfscript>

<cfscript>
    products = arrayNew();
    for(i=1;i<=pr.recordCount;i++){
        product = {};
        if(!reFind('([0-9]+\-)(G|g)(I|i)(F|f)(T|t)',pr['sku'][i])){
            b = new Query(argumentCollection=olddb);
            b.setSql('SELECT * FROM productpics WHERE sku = :sku ORDER BY picorder');
            b.addParam(name='sku',value=pr['sku'][i]);
            pics = b.execute().getResult();
            picList = '';
            for(j=1;j<=pics.recordCount;j++){
                picList = picList & ';' & pics['imagename'][j];
            }

            d = new Query(argumentCollection=olddb);
            d.setSql('SELECT * FROM skucategories WHERE sku = :sku');
            d.addParam(name='sku', value=pr['sku'][i]);
            assignments = d.execute().getResult();

            categories = getCats(assignments);
            writeDump(categories);
            product = {
                store = 'admin',
                websites = 'base',
                attribute_set = 'Default',
                categories = '',
                type = 'simple',
                sku = pr['sku'][i],
                name = reReplace(reReplace(pr['title'][i],'\"','&##34;','all'),'\,','&##44;','all'),
                price = pr['price'][i],
                description = reReplace(reReplace(pr['detail'][i],'\"','&##34;','all'),'\,','&##44;','all'),
                short_description = '',
                image = pics['imagename'][1],
                small_image = pics['imagename'][1],
                thumbnail = pics['imagename'][1],
                weight = pr['weight'][i],
                has_options = 1,
                is_in_stock = 1,
                qty = 1000,
                disabled = 'No',
                status = 'Enabled',
                options_container = 'Black after info Column',
                tax_class_id = 'Taxable Goods',
                visibility = 'Catalog,Search',
                gallery =  right(picList,len(picList)-1) // Seperate images by semicolon (;)
            };
            arrayAppend(products,product);
        }
    }
</cfscript>

Это функция getCats, которая исчезает.

* да, код уродлив и неэффективен. Он не предназначался для выполнения чего-то большего, чем эта единственная работа, и после того, как она закончит работу, ее отбросят, так что не говорите мне о безобразии или неэффективности.

Ответы [ 2 ]

2 голосов
/ 14 июня 2011

Вы назвали переменную в UDF с тем же именем, что и UDF.Либо измените область видимости, либо переименуйте этот запрос в другое.Я рекомендую назвать это как-нибудь еще.

2 голосов
/ 14 июня 2011

Не читая каждую строку вашего кода, у меня возникло Сильное ощущение, что оно связано с черпанием Вар ... так как вы вызываете этот UDF в цикле.

Пожалуйста, варьируйте область, в которой вы запрашиваете переменные.

Pre CF9:

<!--- insert after <cfargument> --->
<cfset var getCats = "">
<cfset var get = "">

At или Post CF9 с Local scope:

<cfquery name="local.getCats" datasource="pgdold">
<cfquery name="local.get" dbtype="query">
...