PDA

Просмотр полной версии : [Вопрос] Как правильно реализовать загрузку и создание организации.



Egor Koltyshev
28.05.2017, 21:29
Всем доброго времени суток. В данный момент пишу систему организаций, и в процессе реализации динамического создания организаций, возникла проблема. Прям никак не могу додуматься как такое сделать, раньше делал такое, но сейчас не могу вспомнить ничего.

Я хочу реализовать вот что:
К примеру в базе данных у меня 2 организации с ID 0 и 3, и когда я создам еще 4 организации, они займут ID 1, 2, 4, 5 (в базе данных и в коде).
Но при создании у них получается ID 2, 3, 4, 5.

Знаю что делаю что - то не так, но понять что - не могу :boredom:

Вот диалог с созданием:

case Dialog_Create:
{
if(!response) return 1;
switch(listitem)
{
case 0:
{
for(new i = 0; i < sizeof(Organization_Info); i++)
{
if(Organization_Info[i][Organization_Created] == true) continue;
Organization_Info[i][Organization_ID] = i;
strmid(Organization_Info[i][Organization_Name], "No Name", 0, strlen("No Name"), 64);

static const format_query_string[] = "INSERT INTO `organizations` (`Organization_ID`, `Organization_Name`) VALUES ('%d', '%s')";
new query_string[sizeof(format_query_string) + (- 2 + 11) + (- 2 + 64)];
format(query_string, sizeof(query_string), format_query_string, Organization_Info[i][Organization_ID], Organization_Info[i][Organization_Name]);
mysql_tquery(mysql_connect_id, query_string, "", "");

static const format_string[] = "Вы создали организацию под ID '%d'\n\
Для редактирования организации используйте команду '/edit'";
new string[sizeof(format_string) + (- 2 + 11)];
format(string, sizeof(string), format_string, Organization_Info[i][Organization_ID]);
SendClientMessage(playerid, -1, string);

Organization_Info[i][Organization_Created] = true;
break;
}
}
}
}

А вот загрузка:

forward Load_Organizations();
public Load_Organizations()
{
new rows;
cache_get_row_count(rows);
if(rows)
{
for(new i = 0; i < rows; i++)
{
cache_get_value_name_int(i, "Organization_ID", Organization_Info[i][Organization_ID]);
cache_get_value_name(i, "Organization_Name", Organization_Info[i][Organization_Name], 64);
Organization_Info[i][Organization_Created] = true;
}
print("[Загрузка организаций] Все организации загружены.");
}
else print("[Загрузка организаций] В базе данных организации не найдены.");
return 1;
}

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

DeimoS
28.05.2017, 21:43
Советую создать ещё один столбец, назвав его, например, row_id и уже его сделать уникальным ключом, установив ему значение AUTO_INCREMET. А уже Organization_ID регулировать самостоятельно.

Сама система довольно странно реализована. При загрузке у тебя ID из таблицы никак не влияет на номер ячейки, в которую загружаются данные, а уже в диалоге ты почему-то обрабатываешь данные исходя из номера итерации.
Я бы вообще советовал создать новый итератор при помощи функционала foreach и уже ему позволить контролировать ID. Ну а без всего этого проблема твоя решается как-то так:


forward Load_Organizations(); public Load_Organizations()
{
new rows;
cache_get_row_count(rows);
if(rows)
{
for(new i = 0, idx; i < rows; i++)
{
cache_get_value_name_int(i, "Organization_ID", idx);
Organization_Info[idx][Organization_ID] = idx;
cache_get_value_name(i, "Organization_Name", Organization_Info[idx][Organization_Name], 64);
Organization_Info[idx][Organization_Created] = true;
}
print("[Загрузка организаций] Все организации загружены.");
}
else print("[Загрузка организаций] В базе данных организации не найдены.");
return 1;
}

Но такая реализация крайне кривая и зависимая от входящих значений.