Предположим, что у Вас есть база данных с самыми большими таблицами, содержащими приблизительно 200 000 строк, и часто изменяемый. Клиент хочет, чтобы Excel соединился через ODBC с базой данных и работу как frontend для управления данными. Данные должны быть модифицируемыми до 25 пользователей одновременно.
Мой первый инстинкт должен был бы рекомендовать что-то еще, например, сеть frontend. Но предположите, что клиент настаивает на решении Excel, Вы рассматривали бы его как выполнимое, и какие ловушки Вы будете видеть в нем?
Мои сомнения были бы о:
Я делаю это постоянно. Нет, вам не нужно вводить всю базу данных или даже всю таблицу. Я использую ADO и VBA и отправляю инструкции SQL через объект Command. Например, у меня есть база данных роялти с фронтэндом Excel.
Пользователь вводит номер счета и инструкцию SELECT, извлекая эту запись и заполняя некоторые пользовательские классы. Пользователь вводит/изменяет некоторые данные и нажимает кнопку 'Сохранить'. Затем класс имеет метод, который записывает запись обратно в базу данных с и UPDATE или INSERT в зависимости от ситуации.
В конце месяца пользователь вводит диапазон дат и извлекает некоторые записи в отчет, снова просто инструкцию SELECT, заполняющую некоторые классы и выводящую на лист.
Используйте транзакцию, чтобы выполнить откат, если возникли проблемы с блокировкой записей, но с 25 пользователями, вероятно, этого не произойдет.
Это действительно должен быть комментарий, но он слишком длинный для поля комментариев, так что вот он.
Если вы хотите проиллюстрировать разницу между unshift и push , достаточно:
#!/usr/bin/perl
use strict; use warnings;
my @x;
push @x, $_ for 1 .. 3;
my @y;
unshift @y, $_ for 1 .. 3;
print "\@x = @x\n\@y = @y\n";
Output:
@x = 1 2 3 @y = 3 2 1
Note use strict;
защищает от многих ошибок программистов и use warnings;
предупреждает при использовании конструкций сомнительной ценности. На вашем уровне ни то, ни другое не является необязательным.
Ну, все они делают разные вещи.
Однако все остальные факторы равны,
push @list, 'foo' if $foo;
является утверждение, которое передает его значение наиболее непосредственно, поэтому он должен быть предпочтительным.
Если вам нужно сделать паузу и подумать о том, что оператор якобы делает что-то такое же простое, как толкание элемента массива, вы делаете что-то неправильно.
my @list = (
$foo ? 'foo' : (),
$bar ? 'bar' : (),
);
может быть в порядке, если это часть какой-то колоссальной инициализации, которая выполняется в другом месте.
Я думаю, что использование
my @list = (
('foo') x!! $foo,
('bar') x!! $bar,
);
указывает на то, что программист имеет - как я могу поставить это? - проблемы .
Кстати, нет такой вещи, называемой x!!
композитный оператор. !!
- двойное логическое отрицание . Он преобразует произвольное ложное значение в определенное, но ложное значение (пустой ряд), которое дает 0
при использовании, где perl
ожидает число. Истинное значение преобразуется в 1
. Вот, !!
оперирует на $ foo
и $ bar
и написание его x!! $ foo
излишне запутывает смысл кода.
x
- оператор повторения . Так,
('foo') x !!$foo;
означает повторить ('foo')
один раз или нет, в зависимости от того, является ли $ foo
истинным или ложным, соответственно .
PS: Конечно, оказывается, что была статья PerlMonks , вводящая так называемый логический оператор squash . Я прочитал статью и считаю ее неубедительной.
-121--3823316-На первый взгляд я бы предложил рассматривать Excel как веб-страницу, то есть извлекать только необходимые данные и использовать конкретную форму для редактирования, которая обновляет одну запись за раз через ADO. Необходимо заблокировать только одну запись и эту запись в течение части времени, необходимого для обновления. Можно проверить, изменилась ли запись с момента ее открытия для редактирования, и пользователям можно сообщить, что они не могут открыть запись для редактирования, а затем оставить ее в форме редактирования или потерять изменения.
Как правило, такая небольшая группа вряд ли должна одновременно менять одну и ту же запись.
Я не думаю, что у вас будут большие проблемы с 25 параллельными пользователями.