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


Как удалить строку в подчиненной таблице


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

#1 aolin

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

  • Пользователи
  • PipPipPip
  • 41 сообщений

Отправлено 20 Апрель 2011 - 19:42

Есть таблица "Счета", в ней поле Акт, куда записывается id записи соответствующего Счету Акта, при его формировании из доп.действия.

Есть таблица "Акт" и подчиненная ей "Позиции Акта", в ней (позиции акта) поле Акт -> связь на Акт.Номер (текстовое поле).

При удалении акта из таблицы "Акт", требуется удалить из таблицы "Позиции Акта" соответствующие ему записи.

Поле Счета.Номер = Акт.Номер (присваевается в процессе формирования)

делаем так:
$sch = data_table("Счета","id={ID}");

  delete_query("Позиции акта", "'Акт'='".$sch['Номер']."'");
  delete_query("Акт", "id=".$sch['Акт']);
в результате акт удаляется, а позиции остаются. как их удалить? у них разные id но одинаковое значение поля Акт.
перепробовали кучу вариантов формирования условия на удаление записей из Позиции акта - итог один.
помогите пожалуйста реализовать механизм.
спасибо.

#2 CbCoder

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

  • Программист ООО "КБ"
  • PipPipPip
  • 8 762 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 21 Апрель 2011 - 08:50

Во-первых, что все таки это за код, и где он выполняется? И второе - какое отношение к удалению позиций Акта имеет Счет? Из Вашего сообщения это не очень то непонятно.

#3 aolin

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

  • Пользователи
  • PipPipPip
  • 41 сообщений

Отправлено 21 Апрель 2011 - 09:48

Есть доп. действие таблицы "Cчета" - формируем акт, в нем и выполняется данный код.
Сделано это для проверки наличия существования у счета экземпляра акта.
т.е. при нажатии на кнопку доп. действия выполняется код (ниже)
в поле Акт таблицы Счет заносится id номер соответствующего ему акта
и если в счете меняются позиции счета, возникает проблема при формировании акта - путаница и плодятся акты и его позиции
сам акт удаляется (работает) и на его место добавляется новый, а позиции удалить не получается
$sch = data_table("Счета","id={ID}");

if ($sch['Акт']!='') {
  delete_query("Позиции акта", "'Акт'='".$sch['Акт']."'");
  delete_query("Акт", "id=".$sch['Акт']);
}

$new_id = insert_query(array(), "Акт");
$data['По счету'] = {ID};
$data['Номер'] = $sch['Номер'];
$data['Дата'] = $sch['Дата'];
$data['На кого'] = $sch['На кого'];
$data['Выписал'] = $user['id'];
$data['Кол-во'] = $sch['Кол-во'];
$data['Сумма'] = $sch['Сумма'];
$data['Оплачено'] = $sch['Оплачено'];
$data['Остаток'] = $sch['Остаток'];
$data['Наша компания'] = $sch['Наша компания'];
update_query($data, "Акт", "id=".$new_id);
$data1['Акт'] = $new_id;
update_query($data1, "Счета", "id={ID}");

$sqlQuery = "SELECT id FROM ".DATA_TABLE."74 WHERE status=0 AND f807=".$sch['ID'];
$result = mysql_query($sqlQuery) or user_error(mysql_error()."<br>".$sqlQuery."<br>", E_USER_ERROR);
while ($row = mysql_fetch_array($result)) {
	$poz_zay = data_table("Позиции счета","id=".$row['id']);
	
	$poz['Акт'] = $new_id;
	$poz['К Акту'] = $sch['Номер'];
	$poz['Описание'] = $poz_zay['Описание'];
	$poz['Ед. изм'] = $poz_zay['Ед. изм'];
	$poz['Цена'] = $poz_zay['Цена'];
	$poz['Кол-во'] = $poz_zay['Кол-во'];
	$poz['Сумма'] = $poz_zay['Сумма'];
	insert_query($poz, "Позиции акта");
}

echo "<script>location.href='".$config["site_root"]."/view_line.php?table=81&line=".$new_id."'</script>";

это стандартная функция, с корректировкой под себя
Счета.Акт - текстовое поле
Позиции акта.Акт - связь с Акт.Номер (текстовое) хранит номер счета(совпадает с нмером акта)
Акт.По счету - связь с Счет.Номер

не работает строка
delete_query("Позиции акта", "'Акт'='".$sch['Акт']."'");

или другими словами надо удалить находясь в записи таблицы СЧЕТА (доп действие)
связанные с ней записи из таблицы АКТ и связанные с таблицей АКТ записи в таблице ПОЗИЦИИ АКТА.

спасибо.

#4 CbCoder

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

  • Программист ООО "КБ"
  • PipPipPip
  • 8 762 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 21 Апрель 2011 - 10:02

Понятно. У Вас синтаксическая ошибка в строке удаления Позиций акта:

delete_query("Позиции акта", "'Акт'='".$sch['Акт']."'");

'Акт' - имя поля, и поэтому в условии SQL должно быть в косых кавычках: `Акт`. В прямых кавычках пишутся строковые константы. Разумеется в данном случае у Вас попросту не срабатывает условие и запрос выдает нулевой результат.

#5 CbCoder

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

  • Программист ООО "КБ"
  • PipPipPip
  • 8 762 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 21 Апрель 2011 - 10:07

И еще, замечание по оптимизации кода, раз уж Вы выложили его целиком. Почему бы это:

$new_id = insert_query(array(), "Акт");
$data['По счету'] = {ID};
$data['Номер'] = $sch['Номер'];
$data['Дата'] = $sch['Дата'];
$data['На кого'] = $sch['На кого'];
$data['Выписал'] = $user['id'];
$data['Кол-во'] = $sch['Кол-во'];
$data['Сумма'] = $sch['Сумма'];
$data['Оплачено'] = $sch['Оплачено'];
$data['Остаток'] = $sch['Остаток'];
$data['Наша компания'] = $sch['Наша компания'];
update_query($data, "Акт", "id=".$new_id);
не заменить на это:

$data['По счету'] = {ID};
$data['Номер'] = $sch['Номер'];
$data['Дата'] = $sch['Дата'];
$data['На кого'] = $sch['На кого'];
$data['Выписал'] = $user['id'];
$data['Кол-во'] = $sch['Кол-во'];
$data['Сумма'] = $sch['Сумма'];
$data['Оплачено'] = $sch['Оплачено'];
$data['Остаток'] = $sch['Остаток'];
$data['Наша компания'] = $sch['Наша компания'];
$new_id = insert_query($data, "Акт");
Зачем вначале добавлять пустую строку, а затем ее обновлять, когда можно сразу вставить все данные?

#6 aolin

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

  • Пользователи
  • PipPipPip
  • 41 сообщений

Отправлено 21 Апрель 2011 - 10:32

по поводу инсерта -так было по умолчанию, мы это не трогали. Вы правы, так лучше,
но по поводу удаления
Сделал так
СЧЕТА.Номер (текстовое) <- АКТ.По счету (ссылка) <- ПОЗИЦИИ АКТА.Акт (ссылка)
в таблице АКТ есть запись, в таблице ПОЗИЦИИ АКТА есть запись.
при удалении код в новой тестовой функции
$sch = data_table("Счета", "id={ID}");
delete_query("Позиции акта", "`Акт`='".$sch['Номер']."'");
delete_query("Акт", "`По счету`='".$sch['Номер']."'");
ошибок не выдает, строк ни в одной таблице не удаляет
названия полей в косых кавычках.
может я еще чего-то упустил?

#7 CbCoder

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

  • Программист ООО "КБ"
  • PipPipPip
  • 8 762 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 21 Апрель 2011 - 10:42

Я что-то не понял, а зачем Вы поменяли предыдущий код? Вы только еще больше этим всё запутали. Сейчас у Вас уже не синтаксическая, а логическая ошибка в коде. Верните лучше как было.

#8 aolin

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

  • Пользователи
  • PipPipPip
  • 41 сообщений

Отправлено 21 Апрель 2011 - 11:37

Сделали так
$sch = data_table("Счета","id={ID}");

if ($sch['Акт']!='') {
  delete_query("Позиции акта", "`Акт`='".$sch['Акт']."'");
  delete_query("Акт", "`По счету`={ID}");
}

$data['По счету'] = {ID};
$data['Дата'] = $sch['Дата'];
$data['На кого'] = $sch['На кого'];
$data['Выписал'] = $user['id'];
$data['Кол-во'] = $sch['Кол-во'];
$data['Сумма'] = $sch['Сумма'];
$data['Оплачено'] = $sch['Оплачено'];
$data['Остаток'] = $sch['Остаток'];
$data['Наша компания'] = $sch['Наша компания'];
$new_id = insert_query($data, "Акт");

$sqlQuery = "SELECT id FROM ".DATA_TABLE."74 WHERE status=0 AND f807={ID}";
$result = mysql_query($sqlQuery) or user_error(mysql_error()."<br>".$sqlQuery."<br>", E_USER_ERROR);
while ($row = mysql_fetch_array($result)) {
	$poz_zay = data_table("Позиции счета","id=".$row['id']);
	
	$poz['Акт'] = $new_id;
	$poz['Описание'] = $poz_zay['Описание'];
	$poz['Ед. изм'] = $poz_zay['Ед. изм'];
	$poz['Цена'] = $poz_zay['Цена'];
	$poz['Кол-во'] = $poz_zay['Кол-во'];
	$poz['Сумма'] = $poz_zay['Сумма'];
	insert_query($poz, "Позиции акта");
}

$data1['Акт'] = $new_id;
update_query($data1, "Счета", "id={ID}");

echo "<script>location.href='".$config["site_root"]."/view_line.php?table=81&line=".$new_id."'</script>";
Вроде заработало при прежних условиях. Удаляет позиции, но не всегда.
Если количество позиций счета не меняется - работает.
С записями в АКТ проблем нет - обновляется при каждом вызове функции.

Последовательность действий:
1
Есть счет. Акта нет.
Формируем акт (доп действие код выше). Отработала как надо.
Акт есть. Есть 3 позиции Акта.
2
В счете добавляем 2 позиции. Сохраняем. Формируем акт.
Акт есть. Изменения по суммам есть. НО в Позиции Акта добавилось еще 5 строк. (итого 8)

В чем ошибка логическая?
Было
СЧЕТ.Номер.....<-.....АКТ.По счету
Счет.Акт..................АКТ.Номер............ <- .......... ПОЗИЦИИ АКТА.Акт

Стало
СЧЕТ.Номер.....<-.....АКТ.По счету........ <- .......... ПОЗИЦИИ АКТА.Акт
Счет.Акт

#9 CbCoder

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

  • Программист ООО "КБ"
  • PipPipPip
  • 8 762 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 21 Апрель 2011 - 14:38

Честно говоря не очень понял каким образом у Вас всплывают лишние строки и т.д. По идее, если Вы удаляете старый Акт и фактически создаете вместо него новый, то старые Позиции в любом случае канут в небытие, даже без их явного удаления, т.к. привязаны они к старому акту и в новом ну никак не могут всплыть. Я просто сразу на это внимание не обратил. Короче, чтобы найти здесь ошибки, нужно сидеть анализировать код плюс разбираться вообще в Вашей конфигурации, что Вы там намудрили, а это уже фактически разработка, что является у нас платной услугой, т.к. отнимает время (=деньги) у программиста. На явные ошибки я Вам указал, далее Вы должны разбираться самостоятельно, или нанимать специалиста.





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

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