SAP CAP篇十五:写个ERP的会计系统吧,Part II

本文目录

  • 本系列文章
  • 目标
  • 开发步骤
    • 数据库表设计
    • 初始数据
      • 初始数据:AccountCategories
      • 初始数据:AccountUsages
      • 初始数据:ChartOfAccounts
      • 初始数据:AccountSubjects
    • Service 定义
    • 生成Fiori App
    • App运行

本系列文章

SAP CAP篇一: 快速创建一个Service,基于Java的实现
SAP CAP篇二:为Service加上数据库支持
SAP CAP篇三:定义Model
SAP CAP篇四:为CAP添加Fiori Elements程序(1)
SAP CAP篇五:为CAP添加Fiori Elements程序(2)
SAP CAP篇六:为CAP添加Fiori Elements程序(3)
SAP CAP篇七:为CAP添加Fiori Launchpad入口 (Sandbox环境)
SAP CAP篇八:为CAP添加App Router并支持Fiori Launchpad (Sandbox环境)
SAP CAP篇九:升级为SAP CDS 7.0, CAP Java 2以及Spring Boot 3
SAP CAP篇十:理解Fiori UI的Annoation定义
SAP CAP篇十一:支持Media Object:图片、附件等
SAP CAP篇十二:AppRouter 深入研究
SAP CAP篇十三:拥抱TypeScript
SAP CAP篇十四:写个ERP的会计系统吧,Part I

目标

基于前一篇的基础继续开发ERP系统。

本篇侧重于会计科目表,同时也会更新之前的公司主数据

会计科目表是基于会计准则的。譬如US GAAP,IFRS以及我国国内的企业会计准则。会计科目表由会计科目项组成。

开发步骤

数据库表设计

从数据库层面来定义会计科目表。

namespace finsys.db;using {sap,
} from '@sap/cds/common';@cds.odata.valuelist
entity AccountCategories : sap.common.CodeList {key ID : Integer;
}@cds.odata.valuelist
entity AccountUsages : sap.common.CodeList {key ID : Integer;
}entity ChartOfAccounts : sap.common.CodeList {key ID    : String(20);Accounts : Association to many AccountSubjectson Accounts.ChartOfAccounts = $self;
}entity AccountSubjects : sap.common.CodeList {key ID    : String(20);ChartOfAccounts : Association to one ChartOfAccounts not null;ParentID : String(20);Category : Association to one AccountCategories not null;Level    : Integer;
}

同时,更新Companies的数据:

@cds.odata.valuelist
entity Companies: managed, cuid, sap.common.CodeList {    ParentCompany: Association to one Companies;    Currency: Currency;Country: Country;Address: String(100);Deleted: Boolean;ChartOfAccounts: Association to one ChartOfAccounts not null;
}

其中:

  • AccountCategories:科目的属性;
  • AccountUsages:科目使用场景;
  • ChartOfAccounts: 会计科目表;
  • AccountSubjects:会计科目信息;
  • Companies:公司主数据,增加了Deleted属性用来表示该主数据是不是已经被删除,另外增加了ChartOfAccounts的引用。

初始数据

再次运行下述命令来插入初始数据:

cds add data

该命令会自动在db文件夹下添加data文件夹,并会自动跳过已维护了数据库csv文件。

初始数据:AccountCategories

文件finsys.db-AccountCategories.csv

ID;name;descr
1;资产类科目;资产类科目
2;负债类科目;负债类科目
3;共同类科目;共同类科目
4;所有者权益类科目;所有者权益类科目
5;成本类科目;成本类科目
6;损益类科目;损益类科目

初始数据:AccountUsages

文件finsys.db-AccountUsages.csv

ID;name;descr
1;银行专用;银行专用
2;证券专用;证券专用
3;金融共用;金融共用
4;保险专用;保险专用
5;银行债券共用;银行债券共用
6;农业专用;农业专用

初始数据:ChartOfAccounts

文件finsys.db-ChartOfAccounts.csv

ID;name;descr
2013;企业会计准则(2013);企业会计准则(2013)

初始数据:AccountSubjects

文件finsys.db-AccountSubjects.csv

ID;ParentID;Level;Category_ID;name;descr;ChartOfAccounts_ID
1001;;1;1;库存现金;库存现金;2013
1002;;1;1;银行存款;银行存款;2013
1003;;1;1;存放中央银行款项;存放中央银行款项;2013
1011;;1;1;存放同业;存放同业;2013
1012;;1;4;其他货币资金;其他货币资金;2013
101201;1012;2;1;外埠存款;外埠存款;2013
101202;1012;2;1;银行本票存款;银行本票存款;2013
101203;1012;2;1;银行汇票存款;银行汇票存款;2013
101204;1012;2;1;信用卡存款;信用卡存款;2013
101205;1012;2;1;信用证保证金存款;信用证保证金存款;2013
101206;1012;2;1;存出投资款;存出投资款;2013
1021;;1;1;结算备付金;结算备付金;2013
1031;;1;1;存出保证金;存出保证金;2013
1101;;1;1;交易性金融资产;交易性金融资产;2013
110101;1101;2;1;本金;本金;2013
11010101;110101;3;1;股票;股票;2013
11010102;110101;3;1;债券;债券;2013
11010103;110101;3;1;基金;基金;2013
11010104;110101;3;1;权证;权证;2013
11010105;110101;3;1;其他;其他;2013
110102;1101;2;1;公允价值变动;公允价值变动;2013
11010201;110102;3;1;股票;股票;2013
11010202;110102;3;1;债券;债券;2013
11010203;110102;3;1;基金;基金;2013
11010204;110102;3;1;权证;权证;2013
11010205;110102;3;1;其他;其他;2013

具体可以参阅财政部的企业会计准则附录中的会计科目编码设计。
限于篇幅,本文不会贴出全部会计科目的编码。

Service 定义

更新FinanceService,添加如下Entities。

    @readonlyentity AccountCategories as projection on dbchartofaccount.AccountCategories;@readonlyentity AccountUsages as projection on dbchartofaccount.AccountUsages;@readonlyentity ChartOfAccounts as projection on dbchartofaccount.ChartOfAccounts;@readonlyentity AccountSubjects as projection on dbchartofaccount.AccountSubjects;

生成Fiori App

通过Fiori: Open Application Geneator来创建Fiori App。

Application Info
添加基于AccountSubjectsTable
Add Table Section

App运行

App运行如下,没有Column定义:
Screenshot 1
修改annotations.cds来添加Column定义:

annotate service.AccountSubjects with @(UI.LineItem #AccountSubjects : [{$Type : 'UI.DataField',Label : 'ID',Value : ID,},{$Type : 'UI.DataField',Label : 'Level',Value : Level,},{$Type : 'UI.DataField',Label : 'Name',Value : name,},{$Type : 'UI.DataField',Label : 'Description',Value : descr,},{$Type : 'UI.DataField',Label : 'ParentID',Value : ParentID,},{$Type : 'UI.DataField',Label : 'Category',Value : Category.name,},]
);

再次运行该App:
ScreenShot 2

后续的文章里面,会继续对这个App进行进一步增强。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/282277.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

适用于智能语音小家电的语音ic类型有哪些?

适用于智能语音小家电的语音ic类型有哪些? 1. 语音播放芯片:这种芯片主要用于实现语音提示和报警功能。例如,当按下某个按钮时,它可以发出语音提醒,或者在出现故障时发出报警声音。这种芯片的应用非常广泛&#xff0…

操作系统笔记之进程调用API中的getpid、fork、wait、exec补充

操作系统笔记之进程调用API中的getpid、fork、wait、exec补充 code review! —— 杭州 2024-03-17 夜 文章目录 操作系统笔记之进程调用API中的getpid、fork、wait、exec补充1.getpid()2.fork()3.wait()4.exec()5.通常,exec() 调用与 fork() 调用一起使用&#xff…

002_avoid_for_loop_in_Matlab避免使用for循环

避免使用for循环 在程序设计思想中,循环是一个很有力的工具。在循环中,计算机很轻松地重复执行相同的操作。循环是汇编之上的编程中最重要的概念之一。Matlab的循环有两个语言构造,一个是for循环,另一个是while循环。在Matlab中&…

JetBrains全家桶激活,分享 GoLand 2024 激活的方案

大家好,欢迎来到金榜探云手! GoLand 公司简介 JetBrains 是一家专注于开发工具的软件公司,总部位于捷克。他们以提供强大的集成开发环境(IDE)而闻名,如 IntelliJ IDEA、PyCharm、和 GoLand等。这些工具被…

总结mac下解决matplotlib中文显示问题的几种方法

一、前言: 使⽤matplotlib画图时,由于matplotlib默认没有中⽂,显⽰中文时会出现空⽩⼩⽅块。 二、方法: 2.1 matplotlib中使用SimHei字体 1)进入终端后查看matplotlib的字体路径: $ python >>&g…

Linux学习-进程

目录 进程基本概念 进程相关命令 进程的创建 进程的调度 进程相关函数接口 进程的消亡 实例:创建九个子进程 目录 进程基本概念 进程相关命令 进程的创建 进程的调度 进程相关函数接口 进程的消亡 实例:创建九个子进程 exec函数…

Python脚本:用py处理PDF的五大功能

一、代码 【第三方库】3个 【Py版本】3.9 【使用前提】关闭所有的word文档 import os from datetime import datetime from docx2pdf import convert from pdf2docx import parse from PyPDF2 import PdfMerger from PyPDF2 import PdfReader,PdfWriter#将文件夹中的所有Wo…

C++语言学习(二)—— C++语言的基本知识

目录 一、面向对象的三个核心概念 二、C语言中的I/O口 三、C语言中的数据类型​​​​​​​ 3.1 逻辑类型 3.2 引用类型 3.2.1 引用作为函数参数 3.2.2 引用作为函数返回值 3.2.3 引用作为类成员 3.3 类类型 四、 C语言中的内联函数 五、 函数重载 六、 带默认形参…

四、分布式锁之自定义分布式锁

1、基本原理和实现方式对比 分布式锁:满足分布式系统或集群模式下多个进程可见并且互斥的锁。分布式锁的核心思想就是多线程都使用同一把锁,实现程序串行执行。 分布式锁需要具备的条件: 特性含义可见性多个线程都能感知到变化互斥性分布…

数据库系统概论-第16章 数据仓库与联机分析处理技术

概念性的介绍,一略而过,不重要。 16.1 数据仓库技术 16.2 联机分析处理技术 16.3 数据挖掘技术 16.4 大数据时代的新型数据仓库 16.5 小结

G - Find a way

题目分析 1.双重bfs,遍历两个起点求最短路再计算总和即可 2.唯一的坑点在于对于一个KFC&#xff0c;两人中可能有一个到不了&#xff0c;所以还要对到不了的点距离做处理 #include <bits/stdc.h> using namespace std; using ll long long; const int N 220;struct pos…

Linux/Ubuntu/Debian从控制台启动程序隐藏终端窗口

如果你想从终端运行应用程序但隐藏终端窗口. 你可以这样做&#xff1a; 在后台运行&#xff1a; 你只需在命令末尾添加一个与号 (&) 即可在后台运行它。 例如&#xff1a; your_command &将 your_command 替换为你要运行的命令。 这将在后台启动该命令&#xff0c…

Three.js基础入门介绍——【毕业季】Three.js动态相册

前言 岁月匆匆&#xff0c;又是一年毕业季&#xff0c;这次做个动态相册展示图片&#xff0c;放些有意思的内容&#xff0c;一起回忆下校园生活吧。 预期效果 相册展示和点选切换&#xff0c;利用相机旋转和移动来实现一个点击切图平滑过渡的效果。 实现流程 基本流程 1、搭…

【python】python汽车效能数据集—回归建模(源码+数据集)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

【学习】软件测试行业未来的发展趋势预测

近年来&#xff0c;随着中国数字经济的蓬勃发展&#xff0c;软件测试行业也迎来了新的春天。从早期的手工测试到自动化测试&#xff0c;再到持续集成和持续交付&#xff0c;中国的软件测试行业经历了快速的发展和变革。各行各业均对软件测试提出了更高的要求&#xff0c;尤其在…

将数据转换成xml格式的文档并下载

现在有一个实体类对象的集合&#xff0c;需要将它们转换为xml文档&#xff0c;xml文档就是标签集合的嵌套&#xff0c;例如一个学生类&#xff0c;有姓名、年龄等&#xff0c;需要转换成一下效果&#xff1a; <student><age>14</age><name>张三</na…

【Java】Oracle发布Java22最新版本

甲骨文&#xff08;ORACLE&#xff09;已经于2023年3月19日正式发布了最新版本的JDK&#xff0c;版本号&#xff1a;22 根据官方声明&#xff0c;Java 22 (Oracle JDK 22) 在性能、稳定性和安全性方面进行了数千种改进&#xff0c;包括对Java 语言、其API 和性能&#xff0c;以…

docker 哲学 - 网络桥接器、容器网络接口 、容器间的通信方式

1、解释 docker0 veth eth 2、vethXX 和 ethXX 是肯定一一对应吗 比如 eth1 对应 veth1 3、如果 A容器使用 默认创建方式 。定义他内部网络为 eth0&#xff0c;容器B使用 --network 连上 已创建的网络 172.89.2.1 。此时假设 B的 ip是 172.89.2.2 &#xff0c;容器网络接口是 e…

Godot 学习笔记(4):一切以场景为中心

文章目录 前言场景搭建新建子场景最简单的按钮事件 手动控制场景手动加载场景添加多个场景对象更快速的获取脚本对象 删除多个场景对象脚本命名的问题 总结 前言 Godot的场景是C#与Godot最后的中间连接。我们解决了场景的加载&#xff0c;我们基本可以保证C#和godot之间的彻底…

C++初阶:vector相关练习

目录 1. 只出现一次的数2. 杨辉三角3. 删除有序数组中的重复项4. 只出现一次的数II5. 只出现一次的数III6. 数组中出现次数超过一半的数7. 电话号码的字母组合&#xff08;多叉树遍历&#xff09; 1. 只出现一次的数 题目信息&#xff1a; 题目链接&#xff1a; 只出现一次的数…