自己做“图书馆借还系统”(免写程序/能管会员/查书况/自动算逾期金)
谈到“图书馆”这个词,我以前想到的,多半是大厅挑高、仰之弥高,藏书量动辄几十万,好多年没踏进去的那种学校 / 政府图书馆。
不过后来我发现,其实很多社区、基金会、学校班级,甚至企业,都有自己的图书馆 / 图书室 / 共用书库,依照组织成员的需求,供给最适当的知识养份。
让我发现这件事的,就是 Ragic 的客户:我们发现很多人用 Ragic 管理书籍(Ragic 实在非常适合扫 ISBN 条形码查询已建檔书目清单),甚至用 Ragic 设计组织专用书库的借还纪录管理系统。
Ragic 的确很适合做这样的“共用书库”管理系统,毕竟,这样的书库通常不想花大钱买专门管理的借还书系统,也不需要过于复杂的功能,此时用 Ragic 这种零程序基础就可以自学设计的数据库工具,DIY 打造一个符合自家组织需求的简单系统,就蛮适合的。
利用 Ragic 你可以自己设计出来的功能,数一数就有:
① 依据自己的需求创建书籍数据库,纪录所有书本数据、借阅状况、存放位置、备注信息(教学点此)
② 为已建檔的书籍创建条形码(教学点此)
③ 创建在线借书单,链接书籍数据库的书籍数据、只显示可借阅书籍(教学点此)
④ 创建“借阅纪录”独立表单(教学点此)
⑤ 创建在线还书单,链接借出的书籍数据(教学点此)
⑥ 创建“跨表单更新借阅状态”单击钮,自动更新书本借阅状况(教学点此)
⑦ 在“借阅纪录”上增加后续还书纪录(教学点此)
⑧ 显示每本书的借阅纪录(教学点此)
⑨ 如果书本逾期未还,可标注已逾期、计算逾期天数、计算逾期罚金(教学点此)
⑩ 显示会员的借阅纪录(教学点此)
为了节省新手订户摸索设计的时间,我设计了一个“演示用数据库”,把上述 Ragic 可以做到的功能放在里面,你可以点以下链接查看:
点此进入借还书系统演示数据库
接下来,我就会利用这个范例数据库,大概演示一下这些功能怎么设计出来。
要说明的是:Ragic 最大特点就是弹性、可以由你自己决定设计,因此你实际试用时,完全不需要把你不需要的功能硬塞进数据库里。建议你可以在读完文章中的设计方法后,依照自己的需求,决定要设计哪些功能、不要设计哪些功能。
例如:假设你不需要逾期管理功能、不需要完整纪录会员信息,那就可以不要设计对应的字段、表单,以及链接关系;而流程设计上,你也可以依照使用习惯、操作频率等考量,决定要自动化更新纪录,还是手动输入数据。
因为功能并不是“越多越好”(功能多有时代表复杂、维护难度提高)、流程也不是全部都要自动化才方便,重点是依据组织目前的使用需求,做出自己觉得最合适的调配。我们相信,你可以用 Ragic 找到更适合自己的方式,做出专属于你的书库管理系统。
① 创建书籍数据库与“藏书细目”
怎么帮书建檔呢?最简单的设计方式是你可以创建一张 Ragic 表单,创建包括 ISBN、书名、作者等信息的字段,然后一笔笔创建或汇入数据;我们也有现成的书籍管理快速范本:
可以一键快速套用后,修改成你要的样子。
如果书库的书很多,你也可以先利用市面上一些扫条形码即可建檔的 app 来建檔后,再把表单汇入 Ragic 之后调整成你要的样子,这部分的教学,可以参阅我们的这篇文章:用 Ragic 打造专属于你的书籍数据库。
不过,在创建书籍数据库时,要先注意一件事:书库中的藏书,是每样书都只有独一无二的一本(小规模书库可能会如此),还是像大规模图书馆那样,每本书都馆藏好多册呢?
每个 ISBN 只收一本书的情况
如果每个书都只收藏独一无二的一本,举例来说, ISBN 码为“9789866525391”的“自由之夏”你的图书馆就只有这一本,借出去就没了,那么你只要在前面设计的以 ISBN 码为独特值字段的书籍数据库表单,增加一些用以记录“借阅状态”的字段,例如“目前借阅状态”、“上次借出(到期日)”等信息,就可以了。希望明确记录到逾期天数等信息的话,还可以增加“可借天数”、“今天”、“是否逾期未还”等字段来套用公式自动带出信息。
这样设计出来的表单就像这样,一个 ISBN 码一笔数据(这是列表页的画面,列表页与表单页的说明请参阅这里):
每个 ISBN 不只一本书:需要另建“藏书细目”
如果你的图书馆会放着三本一模一样、 ISBN 码都是“9789867480729”的“围城”,那在借还书时就会需要进一步区分是借了哪本、还了哪本,才不会在逾期未归时找不到跟谁要。此时,你就会需要在既有、一个 ISBN 一笔数据的“书籍数据库”之外,另外创建一个“一本藏书 = 一笔数据”的“藏书细目”表单,像这样:
在这张表单中,由于 ISBN 不再能当作识别不同书本的独特编号(同一个 ISBN 可能有多本书),我们会需要帮书本另外制作编号,最简单的方式就是创建一个“藏书编号”字段并让它自动生成流水号。另外,由于借阅书籍会以藏书为单元,因此借阅状态也要记录在这张藏书细目表单中。
创建“书籍数据库”与“藏书细目”的链接
由于大家通常还是希望检视同一个 ISBN 编码的书,借出了几本、还有几本可以借,因此建议如果是需要创建“藏书细目”的状况,可以直接创建两张表单:“书籍数据库”与“藏书细目”,然后在它们之间创建链接,让数据管理更有结构更方便。
具体的步骤上,你可以先创建“书籍数据库”表单、接着创建“藏书细目”表单,并且设置“藏书细目”表单中的 ISBN 字段链接与加载自书籍数据库,然后可以在“书籍数据库”表单中利用“显示从其他表单的链接”这个功能显示出所有相关藏书与借阅状态,进而套用各种公式让“书籍数据库”里显示各藏书细目的状况:
这样就可以一方面清楚区分每本藏书的状态,另一方面也清楚个别 ISBN 书号书籍的状况了。有需要的话,还可以创建“存放位置”与“备注”等字段。
(为了方便说明,后面我们演示创建借还书流程时,大多会以“藏书细目”的模式来演示,读者视需求代换即可喔!)
② 为已建檔书籍制作 ISBN / 书籍编号条形码
还记得过去我们在图书馆借书、还书的经验吗?可能是到借还书柜台把要借/要还的书交给图书馆员,接着图书馆员“哔!哔!哔!”扫书籍条形码完成借还程序,也有可能是我们到自助机器自己刷条形码来完成这个流程。
如果希望你经手掌管的小书库也能有类似的便利,不需要每本书都逐一输入编号的话,那么就必须先确保你的每本书都有可以刷的“书籍条形码”。
因为“条形码”这东西在数据管理上最大的用处,就是用来简化手动输入的流程(关于条形码的运作机制,可以参阅这篇文章的详细解说),以柜台结帐、借还书的运用来说,最大的功用是让操作信息系统的人在拿到商品/书本之后,不用麻烦地找到代表那个商品/书本的独一无二的身份编号来输入进信息系统,只需要刷一下保存着这组“身份编号”的条形码图就可以。因此,我们在这里要帮书本制作的条形码,就应该是这本书独一无二的身份编码。
这里,我们一样需要将“书库里一个 ISBN 码只有一本书”的状况,跟“书库里一个 ISBN 码有多本藏书,需要创建藏书细目”的状况区分开来。
假如你的书库里,一个 ISBN 码只有一本书的话,就像前面所说的,在这个书库里“ISBN码”就可以是这本书独一无二的“身份编码”。由于很多书本身就会在封面或封底印制 ISBN 码的条形码,这种情况等于你需要用的书籍条形码已经有人帮你建好,可以省下制作条形码的步骤了。
但假如是“书库里一个 ISBN 码有多本藏书,需要创建藏书细目”的状况,那么如同前面的讨论, ISBN 码没办法有效区分出同个书库里的不同书,我们已经另外创建了“藏书编号”来当书本的独特值编号,此时如果你想要在借还书时使用到条形码,就要另外制作“藏书编号条形码”才行。
你可以很简单的新建一个“藏书编号条形码”字段,套用公式令其值 = 藏书编号字段,同时将字段种类选为“条形码”,这字段就会自己秀出条形码图了:
可以利用标签生成器的功能制作条形码标签,并打印输出来贴在对应的书本上。
③ 创建在线借书单
基本上,我们帮藏书建檔之后,有人要来书库借书的时候,在查阅书本状态就比传统打印件或 Excel 管理来得轻松多了,可以利用数据库的各种搜索与筛选功能来找想要的书,例如在有人询问书库里是否有特定书的时候,在全文检索或字段首部搜索;有人来借书时,可以在全文检索栏或藏书编号/ISBN 字段筛选框扫藏书编号或 ISBN 条形码来查询书本数据并手动修改借阅状态。
如果要进一步减少手动管理数据的步骤、确实记录每一笔借阅信息,可以创建一张在线“借书单”,每次借书填单即可。
“借书单”的设计逻辑跟办公设备租借单很类似,一般而言就是创建一个单据流水号字段、创建一个可能包含“创建日期”默认值的日期字段来记录运行此流程的日期,然后利用链接与加载功能自动带入已经建檔的相关数据(书籍数据或藏书细目数据)。
以“一个 ISBN 码有多本藏书”的例子来说,借书单可以设计成这样(点此查看表单网址):
可以看到我们在演示表单上创建了“借书单号”流水号字段、套用默认值的“借书日期”字段、借书人字段,并且利用子表格来记录借书细项,链接“藏书编号”字段,加载相关信息:“藏书编号+书名”、馆藏地、可借天数。
有需要的话,可以在子表格套用公式让借书单细目的每一笔数据上都自动算出到期日、自动带出借书人名字。
借书时,负责填写借书单的人只要填上借书人名字、输入藏书编号或直接把光标移到藏书编号条形码字段,扫藏书编号的条形码图,就可以自动填写编号并且带入相关加载字段的信息了,可以一次处理多本借阅书籍。
如果是“一个 ISBN 码有一本藏书”的情况,借书单可以像这样(点此查看表单网址):
表单设计基本原则不变,只是链接与加载的来源改变,因此可以直接扫 ISBN 条形码来带入书本数据。
你可以在表单上添加更多设置来让借书流程更方便。首先,由于借书时,其实并不是所有书库里的书都可以借,只有还没被借出的书可以借,因此你可以在链接与加载上添加动态筛选的设置,这样“已借出”的书就不会出现在菜单上,选择起来比较方便:
有需要的话你也可以在子表格的链接与加载的设置中套用子表格连选,以便连续扫条形码。
在借书单上记录好要出借的书之后,你还可以设计一个动作单击钮来自动更新“藏书细目”上的书本状态,不用逐一手动连过去修改状态,这部分我们放在后面这个段落说明。
④ 另外创建“借阅纪录”表单
有了“借书单”,每次谁在哪天借了什么书,就都会有纪录可循,不过因为这些借阅纪录都在“借书单”的子表格里,有时候不是那么一目瞭然,要做一些进阶的操作(例如在藏书细目表单显示这本书过去的所有借阅纪录)也比较不便,因此我们可以透过 Ragic 子表格生成新表单这个功能,将借书单的借阅纪录变成一张独立的新表单,例如这样:
选择“借书单号”为链接字段,同时,为了让借阅纪录表单有自己的独特值字段,建议在借书单的子表格上就像上图一样放一个“借书编号”的子表格字段,这种细项编号的常见做法,是先创建一个隐藏起来的子表格字段“项次”并套用默认值 $SEQ(这个字段就会自动依序生成子表格项次 1,2,3...),然后在“借书编号”字段套用字符串公式令其等于“借书单号-序号”,就可以获取一个一目瞭然的独立编码了。
要注意的是,透过子表格生成新表单生成的“借阅纪录”字段,和原本的借书单子表格字段值是连动的,其中一方修改,另一方也会跟着变动。
⑤ 创建在线还书单
为什么需要特别创建一张“还书单”呢?首先,如果是一般办公设备的租借,经常是批次租借、批次归还,例如开会借了麦克风、投影机、线材三项设备,可能租借时填写一张租借单(包含三个项目),还设备时直接找出原本的租借单,并在上面注记“已归还”即可,并不需要另外设计一张归还单。
但借书的状况可能不同,在我们的经验里,借还书似乎比较常遇到“同一批借出的书本,需要拆单分批归还”的情况。例如我上礼拜一到书库借了 A, B, C 三本书,创建了第一张借书单单号 001;礼拜二我又来借了 D, E 两本书,又创建了第二张借书单单号 002。一个礼拜后我先把 A, D 看完了要先还,此时我如果要分别找到两张借书单、分别注记,其实就有点麻烦。
此时,我们可以另外创建一张“还书单”,先利用链接与加载的功能找出借阅纪录(=借书单子表格数据)中我们需要的数据,带入还书单中。这样,之后只要再进一步设计相对的“更新状态”单击钮,就可以利用还书单中的信息,一次把所有要还的书新的借阅状态(已归还)更新到对应的表单中,不需要东找西找了。
简单的版本例如这样:
(动作单击钮的部分,我们一样会在接下来这个段落再统一说明)
⑥ 创建各种“更新借阅状态”单击钮
管理租借信息时,如果每次物品的租借状态改变,就需要一一手动修改数据的话,会不太方便,此时,创建一个自动化更新借阅状态的动作单击钮会省事得多。由于我们会需要依照“借书单”“还书单”的信息来更新其他表单(“藏书细目”以及“借阅纪录”)的借阅状态,Ragic 的更新其他表单字段值动作单击钮就是最好的选择,以下分别说明借书、还书时可以怎么设计。
“运行借书”动作单击钮,自动更新相关信息
首先整理一下需求:我们列在借书单子表格的每一本藏书,在正式确认借出后,都应该将“藏书细目”的借阅状态更新为“已借出”,可以的话同步显示一些必要的相关信息(例如借出日、到期日、借书人等),以利后续跟踪。
这边要注意的是:由于“更新别张表单字段值”这个功能一定需要根据来源表单的“某个字段值”来做,目前不能指定某个特定的值,因此在做设置之前,我们必须在来源表单——借书单上,先新增对应的“借阅状态”字段,预填上字段值,以便之后可以更新到“藏书细目”表单。
因此,可以在借书单的子表格中,新增了一个名为“更新借阅状态”的字段,默认值设为“已借出”,并将此字段设为只读的隐藏字段(以免误改或混淆),就可以做出如下的设置:
系统会自动根据“借书单”上借阅细项,更新“藏书细目/书籍数据库”表单上对应的书本信息,把它们的“借阅状态”字段更新成“已借出”。同时,系统会自动新增一个‘“运行借书”运行时间’字段,这是设置动作单击钮时,系统自动生成用来记录实际上单击单击钮日期/时间的字段,有助于确认你有没有确实单击了单击钮、也避免一时忘了自己有单击单击钮而重复更新的情形。
还书单:“更新藏书状态”动作单击钮
还书时,我们也可以用一样的逻辑,设计对应的单击钮来更新:
不过,目前还书单演示表单上我们设计的动作单击钮要比这个复杂一点点:我们还设计了另一个用来更新“借阅纪录”表单字段值的动作单击钮“更新借还纪录”,将“更新藏书状态”、“更新借还纪录”归并成一个“运行还书”单击钮并且将“更新藏书状态”、“更新借还纪录”单击钮隐藏,只显示“运行还书”归并单击钮。
接下来,在演示如何在藏书数据中显示借阅纪录时,我将说明演示表单中另外设计一个“更新借还纪录”动作单击钮的原因。
⑦ 在“借阅纪录”表单上增加“还书信息”(借还纪录)
前面我们利用子表格生成新表单的功能,做出了“借阅纪录”表单,可以很方便搜索所有从以前到现在的借书纪录,但这里没有这些借书纪录的详细“下落”:哪些借出的书已经归还了?哪些已经逾期了还流落在外?
我们虽然可以用跟借书单类似的逻辑,在还书单上利用子表格生成新表单的功能生成“还书纪录”但这样生成出来的数据,就只会有已经归还的书,借出之后还“下落不明”的书不会出现在这里,信息仍然是散落、不好跟踪的。
为了让一本书从借到还的完整经历可以呈现在同一张表单中,我们可以再一次利用“更新别张表单字段值”的功能,首先在“借阅纪录”表单上增加一些记录还书状态的字段(例如还书日期、还书编号等),然后设置新的单击钮,在还书时,可以一并利用这个单击钮把还书相关信息更新到借阅纪录中,让它成为更完整的“借还纪录”。
例如这样新增还书信息字段:
从还书单更新:
这边要注意的是:“借还纪录”表单中利用“子表格生成新表单”创建字段,和后来新增的还书信息相关字段有一个不同:前者和“借书单”子表格字段值会连动,后者不会,只会在我们从还书单运行动作单击钮时被动更新信息。
注:这里与“逾期管理”相关的字段设计我们在后段这里有说明。
⑧ 在藏书数据中显示借阅纪录
虽然我们已经在藏书细目表单中记录了借阅状态(并随着借还书而更新),也另外有完整的借还纪录表单可以查看,但我们有时候还是希望在查某本书的时候,可以看到它最近的借还史、知道它现在在谁的手上,这时利用显示从其他表单的链接功能就可以轻松达到目的,把跟这本书相关的借还纪录显示在表单中:
⑨ 逾期管理
如果你需要在藏书细目中一眼看出哪些书逾期未归、是谁拖了很久没还以便进一步催收,或是如果你们进一步还有逾期的罚则(逾期罚金、逾期罚几天不能借书),需要在有人还书的时候结算出罚金的话,可以利用日期字段公式运算、搭配条件公式和 TODAYTZ() 公式来做到。以下是几种可行的方法。
“藏书细目”中的逾期信息管理
以上图的范例表单来说,由于借书时,我们会透过借书单动作单击钮更新“目前借阅状态”以及“借出到期日”字段值(借书单中有先行套用公式计算到期日),此时只要新增“今天”(套用 TODAYTZ() 公式搭配每日公式重算)以及“是否逾期”字段,套用图上的公式即可随时更新是否逾期的信息了。
公式可以依据你的实际情况变化,例如你表单上的字段是“上次借出日期”的话,也可以根据“上次借出日期”+“可借天数”算出到期日。
要注意的是:如果你像范例表单这样,透过动作单击钮更新的字段是同张表单其他公式字段的参照值的话,要确认你的动作单击钮设置时,有在“进阶设置”中勾选“重新计算目的表单的公式”,这样才能正确触发公式。
用“条件式格式”醒目标注需要注意的信息
你也可以利用条件式格式来醒目提示逾期信息,例如范例表单中做了如下设置,让书本外借逾期时,不只醒目提示逾期的事实,还标出是哪一笔借阅状态是“元凶”:
“还书单”中的逾期信息管理
还书时,如果需要马上看出哪本书逾期了、逾期多少天,可以像还书单范例表单这样在还书的细项上新增几个子表格字段,套公式来计算出是否逾期、逾期天数:
当场计算罚金
如果有规定每逾期一天罚多少的话,在“逾期一天罚金”的地方填上每日罚金,再套用公式就能算出罚款。同理,如果规定是“每逾期一天罚不能借书一天”,一样可以结算出要罚几天。规定如果有变,只要相应修改公式内容即可。
有需要的话,你还可以新增一些记录是否支付罚金的打勾选项字段,进一步管控罚款进度。
⑩ 在会员数据中显示借阅纪录
如果你需要详细纪录每一个借书人的借阅纪录,那么你可以设计一张“会员”表单来记录这些会员的基本信息,把借书单、还书单上“借书人”的字段设成链接与加载自会员数据,接着就可以用类似“在藏书细目自动显示相关借阅纪录”的方法,利用“显示从其他表单的链接”功能,在会员数据表上自动显示相关的借阅纪录:
如果你的书库借阅人全部都是数据库中的用户,你也可以将“借书人”字段设成选择用户字段。
小提醒:先做初步设计、测试流程后再逐步增加功能,让你更顺利!
讲到这里,用 Ragic 可以设计出来的“图书馆借还系统”功能我们大致说明完了!在讲解过程中,你或许有发现,很多表单字段、链接关系、功能的设计是环环相扣的,例如为了要达成某个单击钮的目的,必须先在其他地方新增字段,或是为了让“会员数据”自动显示借阅纪录,要先在借阅纪录中链接会员数据表单等等。
不过,别被我们前面的“火力展示”吓到了!这其实不代表用 Ragic 做表单设计“一开始”就要考量那么多东西,把自己搞死。Ragic 的好处就是:它可以随时由你自己调整、扩大,不需要跟工程师漫长沟通、开需求、等人写程序,让数据库设计变成一个真正动态的过程,而不是花老半天、弄一堆功能出来之后,才发现没有用户买单的窘境。
你可以先设计出一个最简单、最基础的体系结构,用用户的角度测试 run 过一轮,请实际使用的人给点意见,看看哪里想要调整、修改之后,再慢慢把“锦上添花”的自动化流程、自动显示相关信息等功能一步步加上去。
这样,初学时就不会太复杂、太难以入手,也不会辛苦弄了很久之后,还是觉得流程不是你要的。以这边借还书的例子来说,你可以先做初步的设计,包括先将书籍建檔,创建简单的借书单、还书单,手动更新纪录一阵子之后,看看哪些流程可以优先加入,再一步一步加到设计中,不用“一步登天”。
设计雏形、测试、重新反推入与调整设计:动态的过程不但可以让你起步顺利,也可以确保这个系统是真正符合你需求的。来试试吧!设计过程遇到任何问题,你都可以来信 support@ragic.com 询问。