Перейти к содержимому


Синхронизация не синхронизирует по полю id


Сообщений в теме: 37

#21 Гость_Roman_*

  • Гости

Отправлено 14 Май 2013 - 10:38

Посмотрите ещё раз, в таблице "Заказы" не удалось синхронизировать только 81 запись по неизвестным причинам. В существующих записях все связи верны, файлы присутствуют.

#22 Андрей Гуляев

    Активный участник

  • Пользователи
  • PipPipPip
  • 94 сообщений
  • Пол:Мужчина

Отправлено 14 Май 2013 - 14:19

В общем всё по прежнему так и не получается сделать данные одинаковыми, это видно по столбцам с итоговыми суммами.

#23 Гость_Roman_*

  • Гости

Отправлено 14 Май 2013 - 14:42

Как я уже сказал, не добавились только 81 запись из более чем 1800 в таблице "Заказы", где-то пошло несоответствие, невозможно установить причину. В таблице "Платежи", например, все данные верны.

#24 Андрей Гуляев

    Активный участник

  • Пользователи
  • PipPipPip
  • 94 сообщений
  • Пол:Мужчина

Отправлено 14 Май 2013 - 15:24

например Заказы Всего строк: 150 из 1861 и Всего строк: 100 из 1777 это же говорит о том что таблицы не одинаковы?

#25 Гость_Roman_*

  • Гости

Отправлено 14 Май 2013 - 15:33

Да, 84 записи отсутствует. Причём из первой программы они выгружаются, но не добавляются во вторую даже по одиночке. Возможно, в этих записях нарушены какие-либо внутренние взаимосвязи.

#26 Андрей Гуляев

    Активный участник

  • Пользователи
  • PipPipPip
  • 94 сообщений
  • Пол:Мужчина

Отправлено 14 Май 2013 - 16:54

Вот это и есть основная проблема, она пропускает а почему не понятно....

#27 Андрей Гуляев

    Активный участник

  • Пользователи
  • PipPipPip
  • 94 сообщений
  • Пол:Мужчина

Отправлено 21 Май 2013 - 02:47

Продолжаю копать где собака зарыта, почему же у меня не работает синхронизация....
У меня ошибка такая.


Ошибка системы.
Error generated:
/var/www/soundfon/include/functions_cron.php(4571) : sql_query()
/var/www/soundfon/cron.php(69) : eval()'d code(1) : sync_data()
/var/www/soundfon/cron.php(69) : eval()
Ошибка SQL запроса: INSERT INTO `cb_data31` (`user_id`,`add_time`,`status`,`f241`,`f681`,`f691`,`f701`,`f711`,`f721`,`f731`,`f741`,`f751`,`f831`,`f841`,`f851`,`f951`,`f1321`,`f1871`,`f961`,`f971`,`f981`,`f991`,`f1001`,`f1011`,`f1021`,`f1031`,`f1041`,`f1051`,`f1061`,`f1071`,`f1081`,`f1091`,`f1101`,`f1111`,`id`,`r`,`s21`) VALUES ('3','2012-10-15 13:02:00','0','ООО Шоу Компани','ФИО','xxxxxxx@mail.ru','','Клиент','','b5mN5GjaBc','777','0','','3','','Да','','1','Клиент','','','','','','','','','','','','','0','','','352','1','S')
Duplicate entry '352' for key 'PRIMARY'

Я понимаю что оно пытаеться добавить строчу а mysql не дает это сделать и говорит что такая строка уже есть и нельзя дулироват primary key
Но как сделать чтобы код не тупил и не пытался добавить то что уже есть? Зачем добавлять когда можно глянуть есть ли строка с таким id и просто update её ведь в каких то случаях такое случаеться? И всё это делает вот этот страшный код из файла functions1.php понимаю что вы специально его не зендили, но я не понимаю как его исправить, да и бестолку править по тому как ревизии всё погубят. Да знаю что можно подключать сторонние php но у меня реально мозга не хватит.

А вот и код. (Еще раз повторюсь что поле id мне нужно синхронизировать инече диструкция наступет) Из за того что поля связи мне нужно выводить по разному в разных базах.

// Синхронизация
if ($sync_exp_fields[$field_id])
{
foreach ($sync_exp_fields[$field_id] as $sync_id=>$sync_field_info)
{
if ($sync_id == $event['sync_id']) continue;

if ($sync_exp_list[$sync_id]['sync_mode']) $sync_line_id=$line["s".$sync_id];
else $sync_line_id=$line_id;
if (!$sync_line_id) continue;
if (($type_field==5)&&($sync_exp_fields[$t_field["s_field_id"]][$sync_id])) // поле связь развернутое в текст
{
$n_link=$new_v;
if ($sync_exp_list[$sync_id]['sync_mode'])
{
$sqlQuery = "SELECT s".$sync_id." as s FROM `".DATA_TABLE.$t_field['s_table_id']."` WHERE id='$n_link'";
$result4 = sql_query($sqlQuery);
$s_res = mysql_fetch_array($result4);
$n_link=$s_res['s'];
}
if ($n_link==0)
{
insert_log('sync','Export faild on table '.$table_id." line ".$line_id." field ".$field_id." on value ".$one_change['new']." - n_link is zerro.", $table_id, $line_id);
}
else
$sync_exp_data[$sync_field_info['sync_id']][$field_id][$sync_line_id]=$n_link;
}
else
{
if ($type_field==5)
$f_val=$new_v;
else
$f_val=$one_change['new'];
if (($sync_exp_list[$sync_id]['sync_mode'])&&($sync_line_id===0))
{
if ($event["is_new_line"])
{
$sync_line_id="^".$line_id;
$sync_exp_data[$sync_field_info['sync_id']][$field_id][$sync_line_id]=$f_val;
}
else
{
$sqlQuery = "SELECT COUNT(*) AS `s_cnt` FROM `".SYNC_CACHE_TABLE."` WHERE `sync_id`='".$sync_field_info['sync_id']."' AND `field_id`='$field_id' AND `line_id`='$line_id'";
$c_result = sql_query($sqlQuery);
$c_row = sql_fetch_assoc($c_result);

if ($c_row['s_cnt'])
$sqlQuery = "UPDATE `".SYNC_CACHE_TABLE."` SET `value`='$f_val' WHERE `sync_id`='".$sync_field_info['sync_id']."' AND `field_id`='$field_id' AND `line_id`='$line_id'";
else
$sqlQuery = "INSERT INTO `".SYNC_CACHE_TABLE."` (`sync_id`, `field_id`, `line_id`, `value`) VALUES ('".$sync_field_info['sync_id']."', '$field_id', '$line_id','$f_val')";
sql_query($sqlQuery);
}
}
else
{
$sync_exp_data[$sync_field_info['sync_id']][$field_id][$sync_line_id]=$f_val;
}
}
}
}

#28 Гость_Roman_*

  • Гости

Отправлено 21 Май 2013 - 07:43

Дело в том, что если в активной базе не пристуствует идентификатор пассивной, то активная база всегда будет пытаться добавить новую запись. Таков протокол синхронизации, в том числе и с 1С. Поле id не предназначено для синхронизации, а код из functions1.php участвует только в выгрузке данных. У нас много синхронизаций, в том числе и со связанными полями, и все записи синхронизированы без ID.

#29 Андрей Гуляев

    Активный участник

  • Пользователи
  • PipPipPip
  • 94 сообщений
  • Пол:Мужчина

Отправлено 21 Май 2013 - 09:06

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

#30 Гость_Roman_*

  • Гости

Отправлено 21 Май 2013 - 09:31

В ближайшее время обработка поля id будет убрана, поле id можно будет только выгружать, вставка значений в это поле неминуемо приводит к ошибкам MySQL, что вполне естесственно. Я настраивал Вам синхронизацию и без id и c id, и по большинству записей было видно, что связи совпадают.

#31 Андрей Гуляев

    Активный участник

  • Пользователи
  • PipPipPip
  • 94 сообщений
  • Пол:Мужчина

Отправлено 21 Май 2013 - 10:49

Хоршо, а если я седелаю копии стобца id и например назову номер, в копии базы заранее создам строки с id попроядку допустим большее кол во чем в базе источние и вычислением пропишу копию значения id в поле номер. В общем строки без данных. Синхронизация обновит строки? Не добавив новые?

#32 Гость_Roman_*

  • Гости

Отправлено 21 Май 2013 - 11:02

Всё зависит от заполнения поля `s` в активной базе. Если оно пустое, или там стоит 'S', то активная база выгрузит строки с флагом, что необходимо их добавить в пассивную, а не обновить. Пассивная же, возвращает активной идентификаторы вставленных записей, которые вставляются в поле `s` и дальше синхронизация идёт уже используя это поле.

#33 Андрей Гуляев

    Активный участник

  • Пользователи
  • PipPipPip
  • 94 сообщений
  • Пол:Мужчина

Отправлено 22 Май 2013 - 23:02

Я в поле s нужние id как теперь иницировать процесс обновления всех данных, а не только тех которые я поменял в активной программе? Как обмануть и сказать что я поменял все поля в активной программе?

#34 Андрей Гуляев

    Активный участник

  • Пользователи
  • PipPipPip
  • 94 сообщений
  • Пол:Мужчина

Отправлено 23 Май 2013 - 00:38

1. UPDATE cb_xxx SET sxx=id; - делает именно то что мне нужно, теперь как заставить думать базу что я все поля изменил и нужно выгрузить данные для синхронизации? изменение поля на u=1 не приводит к перезаписи данных.

2. И еще я разгадал часть проблеммы почему не все поля синхронизируються. Что-то изменилось в версии 198 и теперь допустим если в поле связь стоит "выводить в одну строку" пример строки: "текст 96" то при попытке ввести в поле связь при добавлении "96" она ничего не находит, а если "пробел"+96 то всё находит. Это ярко видно в моей конфигурации: Когда я к заказу привязываю платеж вида "Контрагент сумма 785" я не могу как раньше простоввести просто 785. обязательно пробел перед 785. Жить можно, но первое время я думал я погибну искать платеж среди 1000 строк. Теперь понятно.

#35 Андрей Гуляев

    Активный участник

  • Пользователи
  • PipPipPip
  • 94 сообщений
  • Пол:Мужчина

Отправлено 23 Май 2013 - 02:38

Ивсё равно не синхронизируеться поле связь. Как именно синхронизация находит связь? по тексту? А пробелы учитывает? У меня сомнения на счет того что синхронизация правильно работает с полем связь. Опять же это видно у меня в кофигурации не синхнонизирует поле диктор, почему? /soundfon/fields.php?table=21 Ручками можно выбрать диктора и синхронизайия не проходит, визуально никаких отличий.

Сообщение отредактировал Андрей Гуляев: 23 Май 2013 - 02:42


#36 Гость_Roman_*

  • Гости

Отправлено 23 Май 2013 - 07:42

Иницировать полную выгрузку можно, выполнив первичную в настройках синхронизации. Засинхронизированные уже записи не будут добавлены по новой, а обновят данные. Поле связи синхронизируется по тексту, если целевая таблица не синхронизируется. Однако, в этом случае синхронизация может некорретно сделать связь, в таблице могут быть дубликаты или немного другое написание. Если же целевые таблицы поля связи синхронизируются, синхронизация выполняется по ID.

#37 Андрей Гуляев

    Активный участник

  • Пользователи
  • PipPipPip
  • 94 сообщений
  • Пол:Мужчина

Отправлено 23 Май 2013 - 12:25

Теперь понятно, наверное мне проще поле связь прогнать через импорт т.к. У него более тупой механизм и все должно получиться. Попробую. Попробуйте обноружить баг с пробелом в поле связь. Если нет я специально разверну 2 версии и пришлю доступ и скриншоты, просто это время. Просто попробуйте сделать поле связи с выводом в строку где одним из последних полей цифра. И попробуйте добавить строку в таблицу с этим полем связь. Нашли проблемму? Или нужно более развернуто изложить проблемму с примером?

#38 Гость_Roman_*

  • Гости

Отправлено 23 Май 2013 - 12:36

Проверим этот момент, спасибо за информацию.





Количество пользователей, читающих эту тему: 29

0 пользователей, 29 гостей, 0 анонимных