Page 1 of 1

limit of 30 on getRelatedRecordObjects sql query

PostPosted: Mon Sep 28, 2009 3:29 pm
by rscales
Hi,

Thanks so much for this nice interface to mysql - it's really great.

I'm having trouble getting more than 30 rows back from a getRelatedRecordObjects sql query. My end goal is to import data from a csv but to only insert data if one of the columns in a row is new ('out' below), otherwise, perform an update to the existing row.

from my table delegate class:

function __import__csv(&$data, $defaultValues=array()){

$app =& Dataface_Application::getInstance();
$Rec_existing =& $app->getRecord();
//...snip... from standard import_csv function
foreach ( $rows as $row ){
list($in, $data, $new_out) = explode(',', $row);

$new = 1;
foreach ($Rec_existing->getRelatedRecordObjects('xouts') as $xout){
if($xout->val('out') == $new_out) {
$new = 0;
}
}
}
}
in relationships.ini:

[xouts]
__sql__ = "SELECT * FROM tableX ORDER by out"

The foreach statement only runs through 30 rows, even if the numbers of rows in tableX is >30. I successfully altered the display to display more than 30 rows, but this seems to have no effect on getRelatedRecordObjects. Adding a different LIMIT in the query, just gives an error as it coflicts with the LIMIT 0,30 already automatically added later.

Any clues, or potentially advice on a better way to do this? I am not sure how to leverage sql directly to find the matching values as I only know what to match from inside the import_csv function.

Thanks,
Rich

PostPosted: Mon Sep 28, 2009 3:45 pm
by shannah
getRelatedRecordObjects takes additional optional parameters.
http://dataface.weblite.ca/getRelatedRecordObjects

E.g.
$recs = $o->getRelatedRecordObjects('foo', 0, 1000)
will get up to the first 1000 related records.

PostPosted: Tue Sep 29, 2009 5:39 am
by rscales
Missed that in the documentation.
Thanks, import is working great now.

However, ss I am trying to filter my import to either add new entries or update existing ones, how would I enter new info into an existing record, rather than inserting a new one?

I have

Code: Select all
function __import__csv(&$data, $defaultValues=array()){

$app =& Dataface_Application::getInstance();
$Rec_existing =& $app->getRecord();
//...snip... from standard import_csv function
foreach ( $rows as $row ){
  list($in, $data, $new_out) = explode(',', $row);

  $new = 1;
  foreach ($Rec_existing->getRelatedRecordObjects('xouts') as $xout){
    if($xout->val('out') == $new_out) {
      $new = 0;
      if($xout->val('data') != $data) {
        $xout->setValues(
           array(
             'data'=>$data,
             'in'=>$in
            )
         );

    }
  }
  if($new){
    $record = new Dataface_Record('tableX', array());
    $record->setValues($defaultValues);
    $record->setValues(
       array(
         'out'=>$new_out,
         'data'=>$data,
         'in'=>$in
        )
      );
    elseif {  //update instead of create new record
      $record = $xout;
// gives an error in IO.php - call to a member function field
// on a non-object
    }
   
  records[] = $record;
}
}


So, my question is how do I take the new values of a csv for an existing record and perform an update, rather than creating a new DatafaceRecord? I'm afraid I am still struggling to understand the difference between records and objects. If I instead use getRelatedRecords for $xout, then I don't know how to grab ->val('out') from that.

Otherwise the generic import of new data is working great.

Thanks,
Rich

PostPosted: Wed Sep 30, 2009 5:22 am
by rscales
OK, never mind previous question, I discovered all the dataface io apis in the documentation and have everything working now.

Thanks,
Rich